博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Quartz定时器+Spring + @Autowired注入 空指针异常
阅读量:4601 次
发布时间:2019-06-09

本文共 3867 字,大约阅读时间需要 12 分钟。

 

 

在Quartz的定时方法里引用@Autowired注入Bean,会报空指针错误

 

 

解决办法:

第一种方法:(推荐,简单,亲测可行)

使用@Resource(name="指定要注入的Bean"),代替@Autowired即可,指定了要注入的Bean名字,就能找到该Bean,就不会空指针了。

 

@Resource(name = "deviceStateProducerService")private DeviceStateProducerService deviceStateProducerService;

 

 

示例代码:

看下面红色字体部分

 代码

@Service("microDeviceStateService")public class MicroDeviceStateServiceImpl implements MicroDeviceStateService {        @Resource(name = "deviceStateProducerService")    private DeviceStateProducerService deviceStateProducerService;        @Scheduled(cron="0/10 * * * * * ?")    @Lazy(false)    public void pingDeviceState() {        boolean isSuccess = PingUtils.ping("127.0.0.1", 4, 1000);        MicroDeviceState microDeviceState = new MicroDeviceState();        if(!isSuccess) {            logger.debug("连接设备状态失败!");            microDeviceState.setDeviceState("1");        }else {            microDeviceState.setDeviceState("0");        }                microDeviceState.setDeviceFlag("0");        microDeviceState.setIp("127.0.0.1");        DeviceStateBase deviceStateBase = new DeviceStateBase();        BeanUtils.copyProperties(microDeviceState, deviceStateBase);        deviceStateProducerService.deviceStateSender(deviceStateBase);    }        }

 有的定时器不生效,在类上加注解@EnableScheduling(spring自带的定时任务功能)

 

配置文件

 

 

 

 

 

第二种方法:(也可行,不推荐)

使用Spring原生获取Bean的方法 取代 @Autowired注入,同时,不要与定时方法在同一个类

 

示例代码:

注解方式写了一个定时方法,方法里需要引用Dao层,插入数据库,

直接@Autowired会报空指针异常,做出如下红色字体改动

public class FTPUtil{//    @Autowired//    MicroCameraPassRecordDao microCameraPassRecordDao;    private static MicroCameraPassRecordDao microCameraPassRecordDao = null;        使用Spring获取注入bean    static {        microCameraPassRecordDao =                 (MicroCameraPassRecordDao) SpringContextUtils.getApplicationContext().getBean("microCameraPassRecordDao");    }    /**    * 定时从FTP下载图片到本地,在这个方法里调用别的Dao层的方法    */    @Scheduled(cron="0/20 * * * * * ?")    @Lazy(false)    public synchronized void service() {        FTPUtil ftpUtil = new FTPUtil();        boolean isConnect = ftpUtil.connectServer();        //从FTP下载到工程file下        boolean flag = ftpUtil.download(getFtpPath());                //引用注入Bean,插入数据库        MicroCameraPassRecord cameraRecord = new MicroCameraPassRecord();        cameraRecord.setCameraId(deviceID);        cameraRecord.setAddTime(System.currentTimeMillis());        microCameraPassRecordDao.insert(cameraRecord);            }    }

 getBean(引用类名,开头字母小写)

 

 

 SpringContextUtils

Spring获取Bean的工具类:

package com.zit.util;import java.util.Map;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Service;@SuppressWarnings({ "rawtypes", "unchecked" })@Service("springContextUtils")public class SpringContextUtils implements ApplicationContextAware {    private static ApplicationContext applicationContext;         public void setApplicationContext(ApplicationContext arg0)            throws BeansException {        applicationContext = arg0;    }     /**     * 获取applicationContext对象     * @return     */    public static ApplicationContext getApplicationContext(){        return applicationContext;    }         /**     * 根据bean的id来查找对象     * @param id     * @return     */    public static Object getBeanById(String id){        return applicationContext.getBean(id);    }         /**     * 根据bean的class来查找对象     * @param c     * @return     */    public static Object getBeanByClass(Class c){        return applicationContext.getBean(c);    }         /**     * 根据bean的class来查找所有的对象(包括子类)     * @param c     * @return     */    public static Map getBeansByClass(Class c){        return applicationContext.getBeansOfType(c);    }}

 

转载于:https://www.cnblogs.com/Donnnnnn/p/9664314.html

你可能感兴趣的文章
个人介绍
查看>>
使用python动态特性时,让pycharm自动补全
查看>>
MySQL数据库免安装版配置
查看>>
你必知必会的SQL面试题
查看>>
html5 Canvas绘制时钟以及绘制运动的圆
查看>>
Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween
查看>>
JavaScript空判断
查看>>
洛谷 P1439 【模板】最长公共子序列(DP,LIS?)
查看>>
python timeit
查看>>
Wireless Network 并查集
查看>>
51nod 1019 逆序数
查看>>
20145202马超《JAVA》预备作业1
查看>>
云推送注意(MSDN链接)
查看>>
IDEA 生成 jar 包
查看>>
加减乘除混合版
查看>>
linux基础6-bash shell编程
查看>>
掌握这几种微服务模式助你成为更出色的工程师
查看>>
为什么很多语言选择在JVM上实现
查看>>
CSS Reset CSS Framework
查看>>
LeetCode算法扫题系列19
查看>>