2013-02-19 1 views
4

Я использую весеннюю партию для анализа моих файлов. В ItemProcessor я проверяю правильность входящих полей. Если это не так, я хочу бросить ValidationException и записать в файл соответствующую строку с неправильными полями. Итак, как я могу найти количество строк и имя файла в ItemProcessor?Как я могу получить количество строк и имя файла в itemProcessor - весенняя партия

ответ

1

Не видя вас. Конфигурация 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 для любых линий, которые не могут быть обработаны. Это включает номер строки и может обрабатываться в прослушивателе.

+0

Спасибо за ваш ответ! Я использую эту конфигурацию, чтобы поймать исключения, которые будут возникать из flatFileItemReader. Тем не менее, проверка полей строк выполняется из itemProcessor. Например, в itemProcessor я проверяю, состоит ли первая строка из 10 символов, второе поле - это строка, которая принадлежит определенному списку строки. То, что вы мне предложили, - это передать проверку в поле SetSetMapper во время создания объекта из строки, чтобы поймать исключение flatFileItemReaderException? – pbal

+0

Я предлагаю перенести вашу проверку в полеSetMapper, но другой подход может состоять в том, чтобы подсчитывать строки в ItemProcessor (предполагая его область действия) и сохранять имя файла в тексте execute, чтобы он был доступен для всей работы. – BenG

0

Что касается номера строки, вы можете создать свой собственный 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

Смежные вопросы