当我运行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;
}
答案 0 :(得分:3)
我希望我能对Padis的回应发表评论,因为它让我找到了解决方案。
我对@StepScope范围内的读者和写作者有同样的nullPointerException问题。
Padis完全正确,当他写道,当@Bean的类型为ItemReader
或ItemWriter
时,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()
,则不会调用方法。
TaskletStep
在open()
上调用CompositeItemStream
。它在每个ItemStream上调用open。 @StepScope
上似乎没有设置CompositeItemStream
的读者。
确保步骤构建器在SimpleStepBuilder.registerAsStreamsAndListeners()
中注册您的阅读器。我遇到的问题是我的读者bean的类型是ItemReader
并且代理注册它不是ItemStream
的实例。将我的阅读器bean的类型更改为ItemStream
(StaxEventItemReader
)可以解决问题。