1. ホーム
  2. java

Spring BatchでItemReaderからジョブパラメータにアクセスする方法は?

2023-08-25 11:42:07

質問

これは私の job.xml :

<job id="foo" job-repository="job-repository">
  <step id="bar">
    <tasklet transaction-manager="transaction-manager">
      <chunk commit-interval="1"
        reader="foo-reader" writer="foo-writer"
      />
    </tasklet>
  </step>
</job>

これはアイテムリーダーです。

import org.springframework.batch.item.ItemReader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("foo-reader")
public final class MyReader implements ItemReader<MyData> {
  @Override
  public MyData read() throws Exception {
    //...
  }
  @Value("#{jobParameters['fileName']}")
  public void setFileName(final String name) {
    //...
  }
}

これはSpring Batchが実行時に言っていることです。

Field or property 'jobParameters' cannot be found on object of 
type 'org.springframework.beans.factory.config.BeanExpressionContext'

ここで何が問題なのでしょうか?Spring 3.0のこれらのメカニズムについて、どこでもっと読むことができますか?

どのように解決するのですか?

前述のとおり、リーダーには「ステップ」スコープが必要です。これを実現するには @Scope("step") アノテーションを使用します。以下のように、そのアノテーションをリーダーに追加すれば、うまくいくはずです。

import org.springframework.batch.item.ItemReader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("foo-reader")
@Scope("step")
public final class MyReader implements ItemReader<MyData> {
  @Override
  public MyData read() throws Exception {
    //...
  }

  @Value("#{jobParameters['fileName']}")
  public void setFileName(final String name) {
    //...
  }
}

このスコープはデフォルトでは利用できません。 batch XML 名前空間を使っている場合は利用できます。そうでない場合は、Spring の設定に以下を追加することで、このスコープを利用できるようになります。 Spring Batchのドキュメント :

<bean class="org.springframework.batch.core.scope.StepScope" />