我使用的是Spring Boot,而且我无法在服务bean中注入任务执行程序。 这是一些代码:
@Service
public class ClassA {
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
public void doSht(){
for(int i = 0; i<this.taskExecutor.getMaxPoolSize(); i++){
this.taskExecutor.execute(new ClassB());
}
}
}
B组:
public class ClassB implements Runnable {
@Override
public void run() {
System.out.println("Class B running");
}
}
控制器:
@Controller
public class IndexController {
@Autowired
ClassA ca;
@RequestMapping("/")
public String index(){
return "index";
}
@RequestMapping("test")
public String test(ClassA ca){
ca.doSht();
return "test";
}
}
这是任务执行者配置:
@SpringBootApplication
public class App{
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(30);
return taskExecutor;
}
public static void main(String[] args) throws Exception{
SpringApplication app = new SpringApplication(App.class);
app.run(args);
}
}
我希望在请求到/ test时执行ClassB实例,但是我得到一个NullPointerException,因为任务执行程序没有自动连接到ClassA bean。
我做错了什么?
答案 0 :(得分:1)
要修正错误,请参阅以下说明:
转到IndexController
课程
转到public String test(ClassA ca)
方法
删除Class ca
输入参数表单测试方法
测试方法应该是这样的
测试方法改变了:
@RequestMapping("test")
public String test(){
ca.doSht();
return "test";
}
引起空指针异常是因为测试方法使用ca
方法参数而不是来自ca
注释的@Autowired
对象
答案 1 :(得分:0)
当你在App类中使用@SpringBootApplication时,它正在将自定义bean定义注册到IOC,并且它正确地自动装配bean。否则,您将在自动装配课程中遇到错误。
所以它不是自动装配的问题。您可以设置调试点来检查它。现在在您的控制器中,您使用相同的名称将您的实例变量与方法参数混淆。此外@RequestMapping不提供自定义类对象。因此,它将变为空,您将获得异常。
希望你能理解这个问题。