1. 程式人生 > >Quartz和Spring,Mybatis結合,讀資料庫空指標(NullPointerException)

Quartz和Spring,Mybatis結合,讀資料庫空指標(NullPointerException)

專案中要用定時任務,採用的是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