2013-08-22 67 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

谢谢,我得到了同样的问题,这解决了它对我来说。 –