Я использую весеннюю партию для анализа моих файлов. В ItemProcessor я проверяю правильность входящих полей. Если это не так, я хочу бросить ValidationException и записать в файл соответствующую строку с неправильными полями. Итак, как я могу найти количество строк и имя файла в ItemProcessor?Как я могу получить количество строк и имя файла в itemProcessor - весенняя партия
ответ
Не видя вас. Конфигурация ItemReader. Я не могу быть уверен, но если вы используете что-то вроде FlatFileItemReader для синтаксического анализа csv, то в строгом режиме он будет проверять количество столбцов.
Предполагая, что вы читатель выглядит следующим образом, а именно:
<bean id="iItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="linesToSkip" value="1"/>
<property name="comments" value="#" />
<property name="encoding" value="UTF-8"/>
<property name="lineMapper" >
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="delimiter" value=","/>
<property name="names">
<list >
<value>First_Field</value>
<value>Second_Field</value>
</list>
</property>
<property name="strict" value="true"/>
</bean>
</property>
<property name="fieldSetMapper">
<bean class="uk.co.package.FieldSetMapper">
<property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
</bean>
</property>
</bean>
</property>
</bean>
Он будет бросать FlatFileParseException для любых линий, которые не могут быть обработаны. Это включает номер строки и может обрабатываться в прослушивателе.
Что касается номера строки, вы можете создать свой собственный LineMapper, а затем сохранить номер строки в бизнес-объекте. Пример, в котором я храню линию непереработанные (как есть) вместе с номером строки:
DefaultLineMapper<OneRow> lineMapper = new DefaultLineMapper<OneRow>() {
@Override
public OneRow mapLine(String line, int lineNumber) throws Exception {
return new OneRow(lineNumber, line);
}
};
Конечно, вы уже можете сопоставить объект, у меня была необходимость иметь всю линию НЕОБРАБОТАННАЯ в качестве вклада в мой Процессоры.
В качестве эталона с той же идеей: https://stackoverflow.com/a/23770421/5658642
- 1. Весенняя партия ItemProcessor порядок обработки элементов
- 2. Весенняя партия: агрегирование записей и количество записей
- 3. Весенняя партия, передающая параметр из ItemProcessor в следующий ItemReader sql
- 4. Весенняя партия - StepExecutionListener
- 5. Весенняя партия: itemprocessor не получает все данные, прочитанные читателем.
- 6. Весенняя партия для правил
- 7. Весенняя партия и интеграция
- 8. Как получить имя текущего ресурса в ItemProcessor?
- 9. Весенняя партия NoSuchBeanDefinitionException
- 10. Весенняя партия: создать файл, указав имя программно
- 11. Весенняя партия: процесс большой файл
- 12. Как я могу получить unix, чтобы перечислить количество строк в файле и просто вывести имя файла?
- 13. Что такое весенняя партия?
- 14. Весенняя партия 2.2 JavaConfig
- 15. Весенняя партия: процессор называется дважды после пропуска
- 16. Весенняя партия: условный поток
- 17. Весенняя партия get lastJobExecution
- 18. Весенняя партия rowNum не увеличивается
- 19. Весенняя партия - возможный тупик
- 20. Весенняя партия - передача файлов
- 21. Весенняя партия с аннотацией
- 22. Весенняя партия - цепочка процессоров
- 23. Весенняя партия - Параллельная обработка
- 24. Весенняя партия КартаJobResositoryFactoryBean
- 25. Весенняя партия: условное выполнение шагов
- 26. Весенняя партия с аннотациями
- 27. Весенняя партия: инфраструктура
- 28. Весенняя партия, получающая данные из файла и переходящая к процедуре
- 29. Весенняя партия UNKNOWN состояние
- 30. Весенняя партия: NotSerializableException
Спасибо за ваш ответ! Я использую эту конфигурацию, чтобы поймать исключения, которые будут возникать из flatFileItemReader. Тем не менее, проверка полей строк выполняется из itemProcessor. Например, в itemProcessor я проверяю, состоит ли первая строка из 10 символов, второе поле - это строка, которая принадлежит определенному списку строки. То, что вы мне предложили, - это передать проверку в поле SetSetMapper во время создания объекта из строки, чтобы поймать исключение flatFileItemReaderException? – pbal
Я предлагаю перенести вашу проверку в полеSetMapper, но другой подход может состоять в том, чтобы подсчитывать строки в ItemProcessor (предполагая его область действия) и сохранять имя файла в тексте execute, чтобы он был доступен для всей работы. – BenG