我的应用程序中有一个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一个服务类。我是对的吗?
答案 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;