一尘不染

如何在Spring Batch中从ItemReader访问参数?

spring

这是我的一部分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>

This is the item reader:

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中,我在哪里可以了解有关这些机制的更多信息?


阅读 1148

收藏
2020-04-15

共1个答案

一尘不染

如前所述,你的阅读器需要进行“逐步”调整。你可以通过@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" />
2020-04-15