Spring批处理StaxEventItemReader释放出异常

时间:2013-08-22 10:30:18

标签: xml spring spring-batch

当我运行spring批处理项目时,发生了异常!

例外细节:

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

fileName是正确的!

配置代码:

@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;
}

3 个答案:

答案 0 :(得分:3)

我希望我能对Padis的回应发表评论,因为它让我找到了解决方案。

我对@StepScope范围内的读者和写作者有同样的nullPointerException问题。 Padis完全正确,当他写道,当@Bean的类型为ItemReaderItemWriter时,doOpen()函数未被调用(它导致NullPointerException)< / p>

碰巧的是,将我的bean类型从ItemReader<T>更改为ItemStreamReader<T>ItemWriter<T>更改为ItemStreamWriter<T>是我的解决方案。

答案 1 :(得分: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为空;或者你有解组问题,读者会遇到麻烦 是在第一次读取时还是在随机读取次数后抛出错误? 在检查StaxEventItemReader.doOpen()中设置断点或设置日志级别以进行调试并查看是否出现问题 -

答案 2 :(得分:0)

我现在遇到类似的问题。如果在@StepScope上设置了open(),则不会调用方法。

执行步骤时,{p> TaskletStepopen()上调用CompositeItemStream。它在每个ItemStream上调用open。 @StepScope上似乎没有设置CompositeItemStream的读者。

确保步骤构建器在SimpleStepBuilder.registerAsStreamsAndListeners()中注册您的阅读器。我遇到的问题是我的读者bean的类型是ItemReader并且代理注册它不是ItemStream的实例。将我的阅读器bean的类型更改为ItemStreamStaxEventItemReader)可以解决问题。