簡體   English   中英

我們可以在 Spring Batch 的 Tasklet 中使用 @Autowired 嗎?

[英]Can we use @Autowired in a Tasklet in 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();
    }

}

當我啟動我的應用程序時,出現如下錯誤。

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

你能解釋一下這種奇怪的行為嗎? 我試過在多個地方尋找這個,我認為我們不能在 tasklet 中 @autowire 一個服務類。 我對么?

好的,我發現了錯誤。

在您的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;
    }

您的 UserService 類位於何處? 由於@SpringBootApplication注釋所做的一件事是組件掃描,但它只會掃描子包。 即如果您的SampleBatchApp類在 com.mypackage 中,那么它將掃描子包中的所有類,即 com.mypackage.*。

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

我在類中添加了@Component 和@Configuration,並在TaskLet 類中向我的服務實例添加了@Autowired,如下所示:

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

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

@Autowired
private CrawlerTask crawlerTask;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM