一、序言
今天在写一个非Controller类,里面用了@Autowired
注入了
@Autowired private ObjectMapper objectMapper;
时,在调用objectMapper的readValue()
方法一直报 java.lang.nullpointerexception
异常,打断点才发现注入的objectMapper一直为空。
二、解决办法
通过@PostConstruct来有效注入。
关于@PostConstruct:被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
@Component // 关键,将该工具类注册为组件
public class Test1 implements Runnable {
@Autowired
private ObjectMapper objectMapper;
public static Test1 test1; // 关键
public Test1(){
}
// 关键
@PostConstruct
public void init() {
test1 = this;
test1.objectMapper = this.objectMapper;
}
@Override
public void run() {
String strResult = "{\"data\":\"qwe\",\"msg\":\"成功\",\"code\":1001,\"sign\":\"dffe\"}";
try {
PayResult payResult = test1.objectMapper.readValue(strResult, PayResult.class);
System.out.print(payResult.toString());
} catch (IOException e) {
}
}
}
这样一来,就能在非Controller
类中,通过test1.objectMapper
来调用相关的的函数:
可以看到这样改完以后,test1.objectMapper
不是null .顺利注入。