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

时间:2017-12-08 09:24:12

标签: 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;
    }

}

我有一个服务类如下。

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

}

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);
    }

}

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();
    }





}

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

SampleTasklet中的字段userService需要一个类型为&#39; UserService&#39;的bean。无法找到。

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

3 个答案:

答案 0 :(得分:1)

好的,我发现了错误。

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

确保在

中设置了UserService
@Bean
public SampleTasklet sampleTasklet(UserService userService){
    return new SampleTasklet(userService);
}

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

public class SampleTasklet implements Tasklet {

private UserService userService;

    public SampleTasklet (UserService userService){
        this.userService=userService;
    }

答案 1 :(得分:0)

您的UserService类位于何处?由于@SpringBootApplication注释之一是组件扫描,但它只扫描子包。即如果你的SampleBatchApp类在com.mypackage中,那么它将扫描子包中的所有类,即com.mypackage。*。

或其他替代方法是使用@SpringBootApplication(scanBasePackages = {"com.mypackage"})

答案 2 :(得分:0)

我在类中添加了@Component 和@Configuration,并在TaskLet 类中为我的服务实例添加了@Autowired,如下所示:

@Component
@Configuration
public class CrawlerTask implements Tasklet {
 
    @Autowired
    private BatchService service;

并在我的配置中添加了我的 TaskLet:

@Autowired
private CrawlerTask crawlerTask;