解决 Java 普通 Utils 类(非 Controller、Service)注入 mapper 为 null

在测试代码时候发现一个接口报空值错误,经过debug测试,发现没有注入mapper,mapper在执行时候是空的。

原因是如果我们要在自己封装的util工具类中或者非controller普通类中使用@Autowried注解注入Service或者Mapper接口,直接注入是不能的,因为util使用了静态的方法,我们是无法直接使用非静态接口的,(spring不能注入static变量的原因:
Spring依赖注入是依赖set方法
set方法是普通的对象方法
static变量是类的属性

就算调用 @Component 注解加入还是为 null(Utils 工具类不是静态方法,注解注入的 service 和 mapper 是非静态的,也不行,即使把 service 和 mapper 注入为 static 静态的也还是会报空指针)

@Component
public class FutureData extends TimerTask {

private static Logger logger = LoggerFactory.getLogger(FutureData.class);

@Autowired
private RemoteCtrAirMapper remoteCtrAirMapper;
 
public static FutureData filterUtils;
 
@PostConstruct
public void init(){
	filterUtils = this;
	filterUtils.remoteCtrAirMapper = this.remoteCtrAirMapper;
}


private  void queryResult(){
	ConcurrentHashMap<String, FutureData<String>> requests = RequestManage.getRequests();
    try{
	for(Map.Entry<String, FutureData<String>> entry: requests.entrySet()) {
		 String reqId = entry.getKey();
		logger.info("Key = " + reqId );
		List<RemoteCtrAirResult> list = filterUtils.remoteCtrAirMapper.getAirCtrResult(reqId);
		if(list.size()>0 && null != list){
			RequestManage.getInstance().setRequestData(reqId,list.get(0).getResult());
		}
	}
}catch (Exception e ){
	e.printStackTrace();
//	return new Message(1,null,"失败");
}

}

解决的关键是:需要将 Utils 类添加 @Component 注解注入 Spring 容器,添加 init () 方法,并用注解 @PostConstruct 注解修饰方法, 被 @PostConstruct 修饰的方法会在服务器加载 Servle 的时候运行,并且只会被服务器执行一次。PostConstruct 在构造函数之后执行,init () 方法之前执行。PreDestroy()方法在 destroy () 方法执行执行之后执行, 结果能注入成功!

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值