解决Quartz的Job类中使用注解Service为null的办法
2017-10-23 11:18
519 查看
最近项目中有个需求,需要周期性的执行一个事件,决定使用Quartz这个工具去实现。项目需求是,网页上点击运行按钮,就开始周期性的执行某一事件,然后每次执行将数据插入到数据库中。
项目的环境是SSM框架,spring4.3,Quartz1.6版本,Intellij IDEA 2017.1
遇到的问题是:在java project中使用quartz1.6版本和quartz2.3版本一切正常,正高兴的将这个java project中的代码移植到web工程之后,问题就来了。
1、首先,版本问题,我们的web工程里面已经有人使用maven集成了quartz1.6,但我想用的是2.3版本啊,最后折腾半天,我这边能用2.3版本,他那边又会报错;我用1.6版本,我这边2.3的一些Quartz的新方法全都不能用,没办法,最后我妥协了,用1.6版本。
2、1.6版本的代码写好了之后,quartz也能跑起来了,但我在implements Job的类的execute方法中使用@Autowired XXXService时候,一直提示XXXService为空,很郁闷啊
原先代码如下,一直报出xxxService为空
随后同事说在非spring容器里面调用service的方法需要使用工具类获取service,ApplicationContext.getBean(“xxxService”)
然后写了工具类之后,又报出no bean named ‘xxxService’ available,没脾气,还是获取不到这个service,再去网上搜索Quartz的Job类中如何使用service,搜了一大堆相同的方法,比如什么配置AdaptableJobFactory,试了都没有用,还是报错。最后根据下面两个博客的内容整合之后,可以使用service了。
如何在Java Filter 中注入 Service
ServletContextListener使用
最后代码如下:
QuartzServletContextListener 代码如下:
将QuartzServletContextListener 配置到web.xml中去
XXXJob的代码如下:
最后完美,总算不报错了,也可以在Job中使用service了。
项目的环境是SSM框架,spring4.3,Quartz1.6版本,Intellij IDEA 2017.1
遇到的问题是:在java project中使用quartz1.6版本和quartz2.3版本一切正常,正高兴的将这个java project中的代码移植到web工程之后,问题就来了。
1、首先,版本问题,我们的web工程里面已经有人使用maven集成了quartz1.6,但我想用的是2.3版本啊,最后折腾半天,我这边能用2.3版本,他那边又会报错;我用1.6版本,我这边2.3的一些Quartz的新方法全都不能用,没办法,最后我妥协了,用1.6版本。
2、1.6版本的代码写好了之后,quartz也能跑起来了,但我在implements Job的类的execute方法中使用@Autowired XXXService时候,一直提示XXXService为空,很郁闷啊
原先代码如下,一直报出xxxService为空
public class XXXJob implements Job{ @AutoWired XXXService xxxService; @Override public void execute(JobExecutionContext jobContext) throws JobExecutionException{ System.out.println(xxxService.getResult()); } }
随后同事说在非spring容器里面调用service的方法需要使用工具类获取service,ApplicationContext.getBean(“xxxService”)
然后写了工具类之后,又报出no bean named ‘xxxService’ available,没脾气,还是获取不到这个service,再去网上搜索Quartz的Job类中如何使用service,搜了一大堆相同的方法,比如什么配置AdaptableJobFactory,试了都没有用,还是报错。最后根据下面两个博客的内容整合之后,可以使用service了。
如何在Java Filter 中注入 Service
ServletContextListener使用
最后代码如下:
QuartzServletContextListener 代码如下:
public class QuartzServletContextListener extends QuartzInitializerListener { public static final String MY_CONTEXT_NAME = "servletContext"; @Override public void contextDestroyed(ServletContextEvent sce) { // TODO Auto-generated method stub super.contextDestroyed(sce); } @Override public void contextInitialized(ServletContextEvent sce) { // TODO Auto-generated method stub super.contextInitialized(sce); ServletContext servletContext = sce.getServletContext(); StdSchedulerFactory factory = (StdSchedulerFactory) servletContext .getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY); try { factory.getScheduler().getContext() .put(QuartzServletContextListener.MY_CONTEXT_NAME, servletContext); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
将QuartzServletContextListener 配置到web.xml中去
<listener> <listener-class>x.x.x.QuartzServletContextListener</listener-class> </listener>
XXXJob的代码如下:
public class XXXJob implements Job{ @Override public void execute(JobExecutionContext jobContext) throws JobExecutionException{ try { ServletContext context = null; try { context = (ServletContext) jobContext.getScheduler().getContext() .get(QuartzServletContextListener.MY_CONTEXT_NAME); } catch (SchedulerException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(context); XXXService xxxService = (XXXService)cxt.getBean("XXXService"); System.out.println(xxxService.getResult()); } }
最后完美,总算不报错了,也可以在Job中使用service了。
相关文章推荐
- SSM SpringMVC 非Controller类使用@Autowired注解Service为null的解决办法
- 解决 SpringMvc 非controller类使用@Autowired注解 service注入为null的问题
- 使用dubbo注解@Service注册服务后使用aop或者申明式事物导致无法注册的问题解决办法
- 关于使用super.getHibernateTemplate()中的方法报java.lang.NullPointerException的解决办法
- php数组使用json_encode函数中文被编码成null的原因和解决办法
- 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法
- WCF Service中HttpContext.Current为null的解决办法
- [转]WCF Service中HttpContext.Current为null的解决办法
- [hadoop] map函数中使用FileSystem对象出现java.lang.NullPointerException的原因及解决办法
- 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法
- 多线程中使用HttpContext.Current为null的解决办法
- JavaWeb学习(5.5)---在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法
- Quartz不能直接使用已有对象实例的解决办法
- .net 使用模板页,JS使用document.getElementById("")得到null的解决办法
- Spring使用Quartz定时调度Job无法Autowired注入Service的解决方案
- centos下忘记mysql密码的解决办法一:(停掉正在运行的mysql) [root@NetDakVPS ~]# service mysqld stop 二:使用 “–skip-grant-tabl
- WCF Service中HttpContext.Current为null的解决办法
- Spring注入service为null另类解决办法 工具类 一般类 静态 非controller
- WCF Service中HttpContext.Current为null的解决办法
- Android使用butterknife注解出现nullPointerException解决