【问题标题】:Spring inject task executor in beanbean中的Spring注入任务执行器
【发布时间】:2017-07-30 16:45:21
【问题描述】:

我正在使用 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 中。

我做错了什么?

【问题讨论】:

标签: java spring spring-boot


【解决方案1】:

要修复错误,请参阅以下说明:

  1. 转到IndexController

  2. 转到public String test(ClassA ca)方法

  3. 去掉Class ca输入参数表单测试方法

  4. 测试方法应该是这样的

测试方法改变:

   @RequestMapping("test")
    public String test(){
        ca.doSht();
        return "test";
    }

空指针异常是因为测试方法使用ca方法参数而不是来自@Autowired注解的ca对象

【讨论】:

  • 他是对的,您使用的是方法参数而不是实例变量。 @RequestMapping 的可用参数有:请求正文、请求标头、url 参数、查询参数。
【解决方案2】:

当您在 App 类中使用 @SpringBootApplication 时,它会将您的自定义 bean 定义注册到 IOC,并且它正在正确地自动装配 bean。否则你会在自动装配类上得到错误。

所以这不是自动装配的问题。您可以设置一个调试点来检查它。现在,在您的控制器中,您使用相同的名称将实例变量与方法参数混淆了。此外,@RequestMapping 不提供您的自定义类对象。所以它是 null 并且你得到了异常。

希望你能理解这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多