Чтобы иметь возможность регистрировать все пропущенные записи/строки (из плоского файла), я связал Item (модель данных) с FieldSet.getValues()
в реализации FieldSetMapper<T>
.
Вот record
моя модель данных.
public void loadRecord(FieldSet fieldSet){
record.setFieldSet(fieldSet.getValues());
}
SB обеспечивает запись/строку для onSkipInRead
в FlatFileParseException
. Чтобы иметь то же самое для onSkipInWrite
и onSkipInProcess
, я придумал вышеупомянутое решение. Кроме того, record
не сохраняет все поля из плоского файла, поэтому я не могу использовать каждую строку, используя только модель данных.
Спасибо за помощь !
Теперь я лучше понимаю вашу проблему :)
Сохраните всю строку в своем доменном объекте, а не в FieldSet
используя пользовательский LineMapper
.
Из LineMapper
javadoc:
Интерфейс для отображения строк (строк) для объектов домена, обычно используемых для сопоставления строк, считанных из файла, в объекты домена в каждой строке. Реализации этого интерфейса выполняют фактическую работу по разбору строки без необходимости иметь дело с тем, как была получена линия.
Поэтому с делегатом довольно легко решить вашу проблему:
class StoreLineLineMapper implements LineMapper<DomainObject> {
private LineMapper<DomainObject> delegate;
public DomainObject mapLine(java.lang.String line, int lineNumber) throws java.lang.Exception {
DomainObject record = delegate.mapLine(line, lineNumber);
record.setLineInfo(new LineInfo(line, lineNumber));
return record;
}
}
record
значениями из токенов разобранной строки. Следовательно, я предпочитаю свое решение по этому (на самом деле я не приманки здесь).
Полный код для этого варианта использования:
public class UserMapper implements FieldSetMapper<User> {
@Override
public User mapFieldSet(FieldSet fieldSet) throws BindException {
User user = new User();
String ped = fieldSet.readString("Position effective date");
user.setId(fieldSet.readInt("User ID"));
user.setFn(fieldSet.readString("First Name"));
user.loadRecord(fieldSet); // store fieldSet for regenerating line in future
return user;
}
}
Это приведет к восстановлению строки из поля FieldSet (Delimiter - TAB):
class User{
@Override
public String toString() {
return StringUtils.arrayToDelimitedString(fieldSet,
DelimitedLineTokenizer.DELIMITER_TAB);
}
}
Строки журнала в SkipListener:
class SkipListener {
public static final Logger logger = LoggerFactory.getLogger(SkipListener.class);
@OnSkipInWrite
public void onSkipInWrite(Object item, Throwable t) {
onSkip(item);
}
@OnSkipInRead
public void onSkipInRead(Throwable t) {
if (t instanceof FlatFileParseException) {
FlatFileParseException ffpe = (FlatFileParseException) t;
onSkip(ffpe.getInput());
}
}
@OnSkipInProcess
public void onSkipInProcess(Object item, Throwable t) {
onSkip(item);
}
public void onSkip(Object item) {
logger.info(item);
}
}
User
и один объект FieldSet
и FieldSet
этапе процесса.
FieldSet
объекты FieldSet
, loadRecord()
делает fieldSet.getValues
() и сохраняет возвращенную String[]
.
FieldSetMapper
и скачайте пример руководства по запуску SB; все будет понятнее!