一. 问题描述
在我们的自定义的Job类中,想用@Autowire注入属性,但该属性为空
public class MyJob implements Job {
@Autowired
private RabbitTemplate rabbitTemplate;@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// Job中需要执行的方法
System.out.println("这里是我们自定义的定时任务中,需要执行的任务"+rabbitTemplate);
}
}
执行自定义的任务时,运行到这里就会包空指针异常的错误。
二. 问题讲解
1.这是因为**@Autowire时把属性注入到了Spring注入的job类实例中了**。
3.而我们的job类中方法执行时候,quartz会重新实例化一个jobClass,这个实例和Spring注入的实例是不同的,所以没有属性,属性就是空的。
3.因此执行到这里的时候就会报错。
三. 解决方法
1.我们可以利用ApplicationContextAware接口获取到容器,然后再从容器中取出我们需要的bean对象。
2.做法是新建一个实现了ApplicationContextAware的类,该类用来从容器中取bean。
@Component
public class ApplicationContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}// 根据name获取相应的bean
public static Object getBean(String name){
return applicationContext.getBean(name);
}
}
3.然后再需要的地方,通过这种方式来取值,这样就不会出现空指针的错误了。文章来源:https://www.toymoban.com/news/detail-636182.html
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// Job中需要执行的方法
System.out.println("这里是我们自定义的定时任务中,需要执行的任务"+ ApplicationContextUtils.getBean("rabbitTemplate"));
}
}文章来源地址https://www.toymoban.com/news/detail-636182.html
到了这里,关于Quartz自定义的Job使用@Autowire提示空指针问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!