2

春バッチのプロジェクトを実行したら例外が発生しました!

例外の詳細:

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

3 に答える 3

6

解決策を見つけるための軌道に乗ったので、Padis の応答についてコメントできればと思います。

@StepScope で範囲指定されたリーダーとライターで同じ nullPointerException 問題が発生しました。Padis は完全に正しいです。彼がそれを書いているとき、@ BeanItemReaderの型がItemWriterdoOpen()NullPointerException

たまたま、豆の種類を から に変更することがItemReader<T>解決策でした。ItemStreamReader<T>ItemWriter<T>ItemStreamWriter<T>

于 2015-06-08T17:15:31.567 に答える
0

私は今、同様の問題を抱えています。@StepScopeリーダーopen()メソッドに設定すると、呼び出されません。

TaskletStepstep の実行時に呼び出さopen()れます。CompositeItemStreamすべての ItemStream で open を呼び出します。のリーダーが@StepScopeオンに設定されていないようですCompositeItemStream

ステップビルダーがリーダーを に登録していることを確認してくださいSimpleStepBuilder.registerAsStreamsAndListeners()。私が抱えていた問題は、リーダー Bean のタイプがItemReaderプロキシ登録されていて、それが のインスタンスではないということでしItemStreamた。リーダー Bean のタイプをItemStream( StaxEventItemReader) に変更すると、問題が修正されました。

于 2014-03-22T21:19:28.417 に答える
0

このスレッドを確認する前に、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()) {

したがって、ほとんどの場合、readernull です。または、非整列化の問題があり、リーダーがトラブルに巻き込まれます。
最初の読み取り時またはランダムな回数の読み取り後にエラーがスローされますか? ブレークポイントをチェックするStaxEventItemReader.doOpen()か、ログ レベルをデバッグに設定して、何か問題が発生していないか確認します。

于 2013-08-22T11:05:58.140 に答える