我们可以在 Spring Batch 的 Tasklet 中使用 @Autowired 吗?

jag*_*lan 9 java spring spring-batch

我的应用程序中有一个 Spring Batch tasklet,如下所示。

@Service
public class SampleTasklet implements Tasklet {
    
    @Autowired
    private UserService userService;

    @Override
    public RepeatStatus execute(StepContribution contribution,
                                ChunkContext chunkContext) throws Exception {

        System.err.println(userService.getUsers().size());
        return RepeatStatus.FINISHED;
    }

}
Run Code Online (Sandbox Code Playgroud)

我有一个服务类如下。

@Service
@Slf4j
public class UserService {
    public Map<String, String> getUsers(){
        return null
    }

}
Run Code Online (Sandbox Code Playgroud)

Spring Boot 类:

@SpringBootApplication
@Slf4j
public class SampleBatchApp {

    public static void main(String[] args) {
        log.info("Custom DAM Batch Application starting");
        SpringApplication.run(SampleBatchApp.class, args);
    }

}
Run Code Online (Sandbox Code Playgroud)

Spring Batch File:——根据评论编辑。

@Configuration
@EnableBatchProcessing
public class SampleBatch {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Autowired
    public SampleTasklet sampleTasklet;

    @Bean
    public Job importUserJob() {
        return jobBuilderFactory.get("importUserJob")
                .start(step1())
                .build();
    }
       
    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .tasklet(sampleTasklet)
                .build();
    }

}
Run Code Online (Sandbox Code Playgroud)

当我启动我的应用程序时,出现如下错误。

Field userService in SampleTasklet required a bean of type 'UserService' that could not be found.

你能解释一下这种奇怪的行为吗?我试过在多个地方寻找这个,我认为我们不能在 tasklet 中 @autowire 一个服务类。我对么?

mrk*_*nic 5

好的,我发现了错误。

在您的Java Config 中SampleBatch声明您的 Bean SampleTasklet。这意味着您必须确保注入所有依赖项。这就是为什么你没有得到UserService自动装配。

确保 UserService 被设置在

@Bean
public SampleTasklet sampleTasklet(UserService userService){
    return new SampleTasklet(userService);
}
Run Code Online (Sandbox Code Playgroud)

并且不要忘记在您中添加此构造函数SampleTasklet并在那里分配 UserService 。

public class SampleTasklet implements Tasklet {

private UserService userService;

    public SampleTasklet (UserService userService){
        this.userService=userService;
    }
Run Code Online (Sandbox Code Playgroud)