2013-08-22 3 views
1

Когда я запускаю проект весенней партии, исключение произошло! подробноВесенняя партия 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 равно нулю; или у вас есть проблемы с дислокацией, и читатель попадает в беду.
Ошибка при первом чтении или после случайного числа чтений? Положите контрольную точку под контроль StaxEventItemReader.doOpen() или установите уровень журнала для отладки и посмотрите, что-то не так -

+0

thx много мой XML-файл может выглядеть несколько сложнее. мой тзд Робин

+0

Я думаю, что "setFragmentRootElementName" должен извлечь фрагменты из XML, почему он не –

+0

Почему непринятый? если PortData является корнем xml-файла, вы столкнетесь с вашей проблемой. @ robinson.L: что вы имеете в виду? setFragmentRootElementName используется для перехода от дочерних к дочерним объектам; если вам нужна композиция, вам нужно переопределить 'StaxEventItemReader.moveCursorToNextFragment()' –

0

У меня сейчас аналогичная проблема. С @StepScope, установленным на считывателе open() метод не вызывается.

TaskletStep вызывает open() по адресу CompositeItemStream при выполнении этапа. Он открывается на каждом ItemStream. Читатель с @StepScope, похоже, не установлен на CompositeItemStream.

Убедитесь, что построитель шагов регистрирует ваш читатель в SimpleStepBuilder.registerAsStreamsAndListeners(). Проблема, с которой я столкнулся, заключалась в том, что тип моего считывающего компонента был ItemReader и проксированный зарегистрированный он не является экземпляром ItemStream. Исправлена ​​проблема с изменением типа моего компонента-читателя на ItemStream (StaxEventItemReader).

2

Хотелось бы прокомментировать ответ Padis, так как он поставил меня на поиски решения.

У меня была такая же проблема с nullPointerException, что и у читателя и автора в области @StepScope. Padis совершенно прав, когда он пишет, что, когда тип @Bean является ItemReader или ItemWriter функция doOpen() не вызывается (Это вызывает NullPointerException)

Случается, что, изменяя тип моих бобов из ItemReader<T> до ItemStreamReader<T> и ItemWriter<T> до ItemStreamWriter<T> было решением для меня.

+0

Спасибо, у меня такая же проблема, и это решило ее для меня. –

Смежные вопросы