jobParametersがBeanExpressionContext型のオブジェクト上に見つかりません

csvファイルにデータを書き込むための簡単なバッチ・バッチ・ジョブを作成します。 csvファイル名はジョブのパラメータの受け渡しに依存し、Spring ELによって解釈されます。

job-sample.xml

<bean id="csvFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">

  <!-- write to this csv file -->
  <property name="resource"
      value="file:outputs/csv/domain.done.#{jobParameters['pid']}.csv"/>

  <property name="appendAllowed" value="false"/>
  <property name="lineAggregator">
      <bean
    class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
    <property name="delimiter" value=","/>
    <property name="fieldExtractor">
        <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
        <property name="names" value="id, domainName"/>
        </bean>
    </property>
      </bean>
  </property>
</bean>

上の単位テスト:

public class TestSampleJob extends AbstractTestNGSpringContextTests {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @Test
    public void launchJob() throws Exception {

        JobParameters jobParameters =
            new JobParametersBuilder().addString("pid", "10").toJobParameters();

        JobExecution jobExecution = jobLauncherTestUtils.launchJob(jobParameters);
        Assert.assertEquals(jobExecution.getStatus(), BatchStatus.COMPLETED);

    }
}

問題

「jobParametersが見つかりません」というエラーメッセージが表示されます。

Caused by: org.springframework.expression.spel.SpelEvaluationException:
    EL1008E:(pos 0): Field or property 'jobParameters' cannot be found on object
    of type 'org.springframework.beans.factory.config.BeanExpressionContext'
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:208)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:72)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:52)

解決策

jobParameters Beanは、「ステップ」が始まるまで実際にインスタンス化することはできません。これを修正するには、「ステップ」のスコープでレイトバインドする必要があります。

job-sample.xml

  <bean id="csvFileItemWriter"
    class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
    <!-- ...... -->
  </bean>