将这个字段值直接注入"studentStepOne",唯一使用它的方法

Inject this field value directly into "studentStepOne", the only method that uses it

我开发了 Spring Boot-Batch 代码和 sonarlint/Sonar-Qube 给我以下错误。我经历了 link,但解决方案并不按照这个 link 理解:https://rules.sonarsource.com/java/tag/spring/RSPEC-3305

Inject this field value directly into "studentStepOne", the only method that uses it.

代码:

@Configuration
@PropertySource("classpath:application.properties")
public class StudentJob {
    @Value( "${spring.chunk.size}")
    private String chunkSize;

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private JdbcCursorItemReader<Student> StudentReader;

    @Autowired
    private ItemProcessor<Student, Student> StudentProcessor;

    @Autowired
    private StudentWriter StudentWriter;

    @Bean
    public StudentStepExecuListner StudentStepExecuListner() {
        return new StudentStepExecuListner();
    }

    @Bean("readStudentJob")
    @Primary
    public Job readStudentJob() {
        return jobBuilderFactory.get("readStudentJob")
                .incrementer(new RunIdIncrementer())
                .start(StudentStepOne())
                .build();
    }

    @Bean
    public Step StudentStepOne() {
        return stepBuilderFactory.get("StudentStepOne")
                .<Student, Student>chunk(Integer.parseInt(chunkSize))
                .reader(StudentReader)
                .processor(StudentProcessor)
                .writer(StudentWriter)
                .listener(StudentStepExecuListner())
                .build();
    }
}

基于link,似乎self-explanatory:

That means using parameter injection instead of field injection for dependencies that are only used in a single @Bean method.

所以为了你的工作,像这样实例化它:

  @Bean("readStudentJob")
  @Primary
  public Job readStudentJob(Step StudentStepOne) {
      return jobBuilderFactory.get("readStudentJob")
              .incrementer(new RunIdIncrementer())
              .start(StudentStepOne)
              .build();
  }

无关,但您应该遵循 java 惯例。方法应该使用驼峰命名法。 StudentStepOne() 应该是 studentStepOne()

下面的回答会对你有所帮助。

private StepBuilderFactory stepBuilderFactory;

@Autowired
public void setStepBuilderFactory(StepBuilderFactory stepBuilderFactory) {
    this.stepBuilderFactory= stepBuilderFactory;
}

您可以使用 setter 注入来代替字段注入。不推荐字段注入。