2013-08-22 115 views
1

當我運行一個spring批處理的項目時,出現異常!spring批處理StaxEventItemReader釋放異常

異常詳細信息:

Caused by: java.lang.NullPointerException: null 
at org.springframework.batch.item.xml.StaxEventItemReader.moveCursorToNextFragment(StaxEventItemReader.java:141) 

文件名是正確的!

配置代碼:

@Bean 
@StepScope 
public StaxEventItemReader xmlFileItemReader(@Value("#{jobParameters['fileType']}") String fileType, 
              @Value("#{jobExecutionContext['extractFileName']}") String fileName) throws Exception { 

    System.out.println("======================== fileName =========================="+fileName); 

    StaxEventItemReader reader = new StaxEventItemReader(); 

    reader.setResource(new FileSystemResource(fileName)); 
    reader.setFragmentRootElementName("PortData"); 
    reader.setUnmarshaller(unmarshaller()); 

    reader.afterPropertiesSet(); 

    return reader; 
} 

回答

0

之前所有的檢查this thread和檢查,如果你的XML文件是由像一個單一的對象元素組成:

<Object> 
    <child1>...</child1> 
    <child2>...</child2> 
    <child3>...</child3> 
</Object> 

因爲StAX的讀取器實現適用於像文件

<root> 
    <Object>...</Object> 
    <Object>...</Object> 
<root> 

如果這解決了問題,請停止閱讀! 否則顯然你的配置沒有錯誤。

假設最新的版本(2.2.1.RELEASE)
錯誤是在這條線在StaxEventItemReader.moveCursorToNextFragment()

while (reader.peek() != null && !reader.peek().isStartElement()) { 

所以,最有可能,reader爲null;或者你有解組問題和讀者陷入困境。
初次讀取或隨機讀取數據後是否出錯? 把一個斷點檢查StaxEventItemReader.doOpen()或設置日誌級別進行調試,看看是否出現問題 -

+0

thx很多我的XML文件可能看起來有點複雜。我味精羅賓

+0

我覺得 「setFragmentRootElementName」 應提取XML,片段爲什麼會失敗 –

+0

爲什麼不被接受?如果PortData是xml文件的根目錄,則會遇到問題。 @ robinson.L:你什麼意思? setFragmentRootElementName用於從子對象移動到子對象;如果你需要組合,你必須重寫'StaxEventItemReader.moveCursorToNextFragment()' –

0

我現在有類似的問題。在讀卡器上設置@StepScopeopen()方法不被調用。

TaskletStep當步驟執行時調用open()CompositeItemStream上。它調用每個ItemStream打開。具有@StepScope的閱讀器似乎未在CompositeItemStream上設置。

確保步驟構建器在SimpleStepBuilder.registerAsStreamsAndListeners()中註冊您的閱讀器。我遇到的問題是我的讀者bean的類型是ItemReader,代理註冊它不是ItemStream的實例。將我的閱讀器bean的類型更改爲ItemStreamStaxEventItemReader)修復了此問題。

2

我希望我可以評論帕迪斯的迴應,因爲它使我找到解決方案的軌道。

我與@StepScope中的閱讀器和書寫器的作用域有相同的nullPointerException問題。 泛非是完全正確的,他寫道,當@Bean的類型是ItemReaderItemWriterdoOpen()功能不叫(它使NullPointerException

它發生,從ItemReader<T>改變我的豆子的類型到ItemStreamReader<T>ItemWriter<T>ItemStreamWriter<T>是我的解決方案。

+0

謝謝,我得到了同樣的問題,這解決了它對我來說。 –