Quartz定时器+Spring + @Autowired注入 空指针异常
在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", , );
MicroDeviceState microDeviceState = new MicroDeviceState();
if(!isSuccess) {
logger.debug("连接设备状态失败!");
microDeviceState.setDeviceState("");
}else {
microDeviceState.setDeviceState("");
}
microDeviceState.setDeviceFlag("");
microDeviceState.setIp("127.0.0.1");
DeviceStateBase deviceStateBase = new DeviceStateBase();
BeanUtils.copyProperties(microDeviceState, deviceStateBase);
deviceStateProducerService.deviceStateSender(deviceStateBase);
}
}
有的定时器不生效,在类上加注解@EnableScheduling(spring自带的定时任务功能)
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd"
default-lazy-init="true"> <task:scheduler id="scheduler" pool-size="" />
<task:executor id="executor" keep-alive="" pool-size="100-200"
queue-capacity="" rejection-policy="CALLER_RUNS" />
<task:annotation-driven executor="executor" scheduler="scheduler" />
<!-- 注解配置定时器 -->
<context:annotation-config />
<!-- spring扫描注解的配置(要扫描的包,即定时器所在包) -->
<context:component-scan base-package="com.zit.adapter.camera.CameraListener" /> </beans>
第二种方法:(也可行,不推荐)
使用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);
} }
Quartz定时器+Spring + @Autowired注入 空指针异常的更多相关文章
- @Autowired 警告 Field injection is not recommended Spring @Autowired注入
问题: 一. 在IDEA升级2017版后,发现以前使用的 @Autowired 出现了个警告 Field injection is not recommended. @Autowired的三种使用方式 ...
- Spring @Autowired 注入为 null
原因 配置缺失,比如为开启注解扫描驱动.注入组件为注册: 使用 new 关键字创建的对象不受spring容器管理,无法注入: 注入静态变量, 静态变量/类变量不是对象的属性,而是一个类的属性,spri ...
- spring @Autowired注入map
注入map,平常一般不会这么做,今天看一段老代码时发现有这么个用法.补习一下. @Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会 ...
- Spring Autowired 注入失败总是Null
报错:NullPointerException 分析:错误原因是注入失败? <context:annotation-config/> <context:component-scan ...
- spring@Autowired注入为null的问题,2017年9月14日21点41分记录
这个小问题纠结了三个小时..发出来留个纪念 这是启动项目的时候 这是请求控制器的时候 图1注入的时候是null,图2请求控制器的时候是有的,这是因为图1debug的地方是构造器..autowire ...
- spring @Autowired注入对象,在构造方法中为null问题
出现问题的代码如下: @Service public class BaseHttpServiceImpl implements BaseHttpClient { private final stati ...
- spring @Autowired注入的原理
只知道如何用Autowired注解,知道可以替代set,get方法,很方便,却一直不知道,为什么可以代替 今天探索一下原因,所谓知其然还要知其所以然,才能理解的更好,记忆的更牢,才能转化为自己的知识. ...
- java Quartz定时器任务与Spring task定时的几种实现,
java Quartz定时器任务与Spring task定时的几种实现 基于java 的定时任务实现, Quartz 时间详细配置 请查阅 http://www.cnblogs.com/si ...
- Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入
Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入 Spring4整合quartz2.2.3中Job任务使用@Autowired不能注入 >> ...
随机推荐
- Linux LVS_NAT DR
一.lvs-nat LVS是Linux Virtual Server的简写,意即Linux虚拟服务器.是由章文嵩博士开发的一个在内核层面的负载均衡调度器. lvs是在netfilter的INPU ...
- 游戏客户端Session的统一管理
看本系统文章需要些C语言.数据结构和网络基础知识! 说明:由于游戏服务器端会有成千上万的客户端进行连接请求,所以要求我们需要做一些简单的会话管理!如下图 1.简单说明 进行统一的分配和管理,就需要我们 ...
- Django框架详细介绍---视图系统
Django视图系统 1.什么是视图 在Django中,一个视图函数/类,称为视图.实质就是一个用户自定义的简单函数,用来接收WEB请求并xing响应请求,响应的内容可以是一个HTML文件.重定向.一 ...
- https://scrapingclub.com/exercise/basic_captcha/
def parse(self, response): # set_cookies = response.headers.getlist("set-cookie").decode(& ...
- Porsche Piwis Tester II V14.000 with CF30 Laptop at autonumen.com
Porsche piwis tester ii is the latest professional tester for Porshe,the most poweful diagnose and o ...
- 各种数据库连接字符串 -- c#
sqlite : connectionString="Data Source=|DataDirectory|\databasename.db;Pooling=true;FailIfMissi ...
- js数字转换成财务金额
function dealNumberToMoney(money){ var fmtAmt = ""; if(money&&money!=null){ money ...
- aliplayer 视频播放报错
问题总结: 1.引用 阿里库时href和src 文件路径不加http <link rel="stylesheet" href="//g.alicdn.com/de/ ...
- conda环境py36 requirements.txt
生成: conda list -e > requirements.txt 使用: conda install --yes --file requirements.txt # This file ...
- VC++ 实现INI文件读写操作
转载:https://blog.csdn.net/fan380485838/article/details/73188420 在实际项目开发中,会用ini配置文件,在此总结一下对ini读写操作 一:读 ...