2013-02-19 60 views

回答

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個字符,第二個字段是屬於特定字符串列表的字符串。你建議給我的是在從行中創建對象的過程中傳遞fieldSetMapper中的驗證以捕獲flatFileItemReaderException? – pbal 2013-03-06 12:47:37

+0

我建議將你的驗證移入fieldSetMapper,但另一種方法是對ItemProcessor中的行進行計數(假設它的步長範圍)並將文件名存儲在執行上下文中,以便它可用於整個工作。 – BenG 2013-03-26 13:54:10

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

相關問題