背景
在写公众号开发的时候,有一个处理get请求,我想使用Spring提供的RestTemplate处理发送;
原来是这样的
@Component
public class WeChatContant {
@Autowired
private RestTemplate restTemplate;
/**
* 编写Get请求的方法。但没有参数传递的时候,可以使用Get请求
*
* @param url 需要请求的URL
* @return 将请求URL后返回的数据,转为JSON格式,并return
*/
public JSONObject doGerStr(String url) throws IOException {
ResponseEntity responseEntity = restTemplate.getForEntity
(
url,
String.class
);
Object body = responseEntity.getBody();
assert body != null;
JSONObject jsonObject = JSONObject.fromObject(body);
System.out.println(11);
return jsonObject;
}
}
但是到这里的话restTemplate这个值为空,最后导致空指针异常。发生的原因是
static模块会被引入,当class加载后。你的component组件的依赖还没有初始化。
(你的依赖都是null)
解决方法
可以使用@PostConstruct这个注解解决
1,@PostConstruct 注解的方法在加载类的构造函数之后执行,也就是在加载了构造函数之后,
为此,可以使用@PostConstruct注解一个方法来完成初始化,
@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
2,执行优先级高于非静态的初始化块,它会在类初始化(类加载的初始化阶段)的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。
自己理解的意思就是在component组件都加载完之后再加载
修改过后的代码如下
@Component
public class WeChatContant {
@Autowired
private RestTemplate restTemplate;
private static RestTemplate restTemplateemp;
@PostConstruct
public void init(){
restTemplateemp = restTemplate;
}
/**
* 编写Get请求的方法。但没有参数传递的时候,可以使用Get请求
*
* @param url 需要请求的URL
* @return 将请求URL后返回的数据,转为JSON格式,并return
*/
public static JSONObject doGerStr(String url) throws IOException {
ResponseEntity responseEntity = restTemplateemp.getForEntity
(
url,
String.class
);
Object body = responseEntity.getBody();
assert body != null;
JSONObject jsonObject = JSONObject.fromObject(body);
System.out.println(11);
return jsonObject;
}
}
如果发现博文有问题欢迎各位老鸟多多指教