77

これは私の一部です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 のこれらのメカニズムについて詳しくはどこで読むことができますか?

4

7 に答える 7

78

前述のとおり、リーダーは「ステップ」スコープである必要があります。@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) {
    //...
  }
}

このスコープはデフォルトでは使用できませんが、batchXML 名前空間を使用している場合は使用できます。そうでない場合は、 Spring Batch のドキュメントに従って、Spring 構成に以下を追加すると、スコープが利用可能になります。

<bean class="org.springframework.batch.core.scope.StepScope" />
于 2011-08-28T03:21:06.857 に答える
20

かなり遅くなりましたが、@BeforeStep メソッドにアノテーションを付けることでこれを行うこともできます。

@BeforeStep
    public void beforeStep(final StepExecution stepExecution) {
        JobParameters parameters = stepExecution.getJobExecution().getJobParameters();
        //use your parameters
}
于 2016-10-05T12:08:04.780 に答える
14

jobParametersを使用できるようにするには、リーダーをスコープ'step'として定義する必要があると思いますが、アノテーションを使用してそれを実行できるかどうかはわかりません。

xml-configを使用すると、次のようになります。

<bean id="foo-readers" scope="step"
  class="...MyReader">
  <property name="fileName" value="#{jobExecutionContext['fileName']}" />
</bean>

詳細については、SpringBatchのドキュメントを参照してください。

おそらく@Scope、xml-configでステップスコープを使用して定義することで機能します。

<bean class="org.springframework.batch.core.scope.StepScope" />
于 2011-05-23T07:53:03.507 に答える
2

ジョブの実行中に、次のように Job パラメーターを渡す必要があります。

JobParameters jobParameters= new JobParametersBuilder().addString("file.name", "filename.txt").toJobParameters();   
JobExecution execution = jobLauncher.run(job, jobParameters);  

式言語を使用すると、次のように値をインポートできます。

 #{jobParameters['file.name']}
于 2017-06-19T01:00:22.333 に答える
-3

ジョブパラメータをBeanとして適切にマップとして宣言しましたか?

または、ファイル名のゲッターがないJobParametersオブジェクトを誤ってインスタンス化した可能性がありますか?

式言語の詳細については、Springのドキュメントを参照してください

于 2011-06-04T09:11:59.493 に答える