我正在使用spring批解析我的文件。在ItemProcessor中,我驗證傳入字段是否正確。如果他們不是,我想拋出一個ValidationException並記錄到一個文件對應的行中有不正確的字段。那麼,如何在ItemProcessor中找到行數和文件名?如何獲取itemProcessor中的行數和文件名 - spring批處理
4
A
回答
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
至於行號,您可以建立自己的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. spring批處理:itemprocessor未獲取讀取器讀取的所有數據
- 2. 如何獲取批處理文件來處理文件名中的空格?
- 3. Spring批處理 - StepExecutionListener
- 4. 如何在Spring批處理中從資源(itemReader)獲取文件名?
- 5. Spring批處理:如何獲取所有行讀取的錯誤?
- 6. Spring批處理:如何處理多行日誌文件
- 7. 如何從已執行的批處理文件中獲取值
- 8. Spring batch ItemProcessor處理項目的順序
- 9. 在Spring批處理中讀取並處理多個源文件
- 10. 如何在Spring批處理中同時讀取2個文件
- 11. 如何在windows批處理文件中獲取其餘參數?
- 12. 批處理文件從文件名和目錄中讀取
- 13. 從同一批處理文件中讀取批處理文件的第一行?
- 14. 如何從批處理文件中調用批處理文件?
- 15. 如何獲取Windows批處理文件中的返回值
- 16. 如何從批處理文件中獲取進程的PID?
- 17. 如何使用Spring批處理文件名中特定單詞的目錄中的所有未處理文件
- 18. 如何獲取ItemProcessor中的當前資源名稱?
- 19. Spring批處理 - 需要使用itemProcessor/itemWriter中的對象但不能保留它
- 20. 在批處理腳本中,如何獲取文件的長名稱?
- 21. 讀取數千個jpeg文件的名稱作爲Spring批處理的輸入
- 22. 如何比較批處理文件中的文件名
- 23. 如何控制批處理文件中的輸出文件名?
- 24. 如何從批處理文件中的文本文件中獲取字符串?
- 25. 獲取輸入數據批處理文件執行後
- 26. Spring批處理概念需要說明
- 27. Spring批處理項目集成了Spring批處理管理器
- 28. Spring批處理問題
- 29. Spring批處理並行處理
- 30. Spring批處理 - 使用內存數據庫處理大文件
謝謝你的回答!我使用這個配置來捕獲將從flatFileItemReader發生的異常。然而,行的字段的驗證是從itemProcessor執行的。例如,在itemProcessor中,我檢查第一個字符串是否包含10個字符,第二個字段是屬於特定字符串列表的字符串。你建議給我的是在從行中創建對象的過程中傳遞fieldSetMapper中的驗證以捕獲flatFileItemReaderException? – pbal 2013-03-06 12:47:37
我建議將你的驗證移入fieldSetMapper,但另一種方法是對ItemProcessor中的行進行計數(假設它的步長範圍)並將文件名存儲在執行上下文中,以便它可用於整個工作。 – BenG 2013-03-26 13:54:10