Quartz和Spring,Mybatis結合,讀資料庫空指標(NullPointerException)
阿新 • • 發佈:2019-01-09
專案中要用定時任務,採用的是Quartz,配置好了可以跑定時了,但是在讀資料庫的時候報空指標,注入的mapper介面類沒有獲取到,費了點時間找到了原因,在這裡記錄下。
我的Quartz是這麼配置的
<!--Quartz--> <!-- 整合方式:JobDetailFactoryBean,並且任務類需要繼承QuartzJobBean--> <!-- 定義jobDetail --> <bean id="jobDetailTest" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- durability 表示任務完成之後是否依然保留到資料庫,預設false --> <property name="durability" value="true" /> <!-- 目標類 --> <property name="jobClass" value="com.wewolf.schedule.TestTask"></property> </bean> <!-- 觸發器CornTrigger --> <bean id="cornTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobDetailTest"/> <!-- 每個10秒觸發 --> <property name="cronExpression" value="0/10 * * * * ?"/> </bean> <!-- 定義核心排程器 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <ref bean="cornTrigger"/> </property> </bean>
注入的jobDetail是JobDetailFactoryBean這個類。簡單的說就是Quartz和Spring是兩個容器,維護的東西不是一套。所以Spring注入的mapper介面類在Quartz中不能通過@Autowired或者@Resource獲取到的,所以會報java.lang.NullPointerException。解決方式有幾個,我用的解決方式是通過下面這種方式獲取Spring注入的類
MailMapper mailMapper = BeanUtil.applicationContext.getBean(MailMapper.class);
還有其他的解決方案,大多是通過別的方式來配置Quartz