解决 Java 普通 Utils 类(非 Controller、Service)注入 mapper 为 null
普通类或Util类依赖注入@Service或@Mapper
·
在测试代码时候发现一个接口报空值错误,经过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条内容
所有评论(0)