在测试代码时候发现一个接口报空值错误,经过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 () 方法执行执行之后执行, 结果能注入成功!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐