我在为@service设置构造函数时遇到问题。 “url”和“template”在我的代码中的许多地方使用,并希望在一个地方初始化它。这是代码,
@Service
public class RabbitMQServices {
@Autowired
public RabbitMQServices() {
// Create RabbitMQ management url
this.url = "http://" + rmqfqdn + ":" + rmqmgmtport;
// Create http template
line 36 ==> this.template.getInterceptors()
.add(new BasicAuthorizationInterceptor(rmqadminname,
rmqadminpw));
}
// Create vhost
private String createVhost(RabbitmqRepository repo) {
// Create default parameters
result = "OK";
// Create service uri
String uri = url + "/api/vhosts/" + repo.getTenantid() + "-vh";
// Create header entity
HttpHeaders header = new HttpHeaders();
header.set("content-type", "application/json");
HttpEntity<String> entity = new HttpEntity<String>(header);
try {
// Go create vhost
template.exchange(uri, HttpMethod.PUT, entity, String.class);
} catch(Exception e) {
result = "FAIL: " + e;
}
return result;
}
// Class variables
String result;
String tenantpw;
String url;
RestTemplate template;
// RabbitMQ Server URI
@Value("${rabbitmq.server.fqdn}")
private String rmqfqdn;
// RabbitMQ Server Managment port
@Value("${rabbitmq.server.management.port}")
private String rmqmgmtport;
// RabbitMQ Server administrator name
@Value("${rabbitmq.server.adminname}")
private String rmqadminname;
// RabbitMQ Server administrator password
@Value("${rabbitmq.server.adminpw}")
private String rmqadminpw;
我收到以下错误,
Caused by: java.lang.NullPointerException: null
at com.belcan.services.RabbitMQServices.<init>(RabbitMQServices.java:36) ~[bin/:na]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_101]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_101]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_101]
at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:1.8.0_101]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
... 38 common frames omitted
第36行是构造函数中的this.template行,
this.template.getInterceptors() ...
答案 0 :(得分:0)
您正在获取NPE,因为template
为空。您需要自动装配RestTemplate
@Autowired
RestTemplate template;
答案 1 :(得分:0)
您最好使用@PostConstruct注释,而不是使用构造函数。这不是Spring注释,而是位于J2EE库中。
默认情况下,Spring不知道这个注释。您必须在配置中注册它。添加
<context:annotation-config />
到您的configuration.xml
@PostConstruct
private void init() {
// init your Spring bean here..
}
在构造bean之后立即调用init方法。那时你很害羞,你的bean中的所有东西都是自动装配的。不要忘记自动装载您正在获取NullPointerException的RestTemplate。
答案 2 :(得分:0)
这很有效,
@Service
public class RabbitMQServices implements InitializingBean {
RestTemplate template = new RestTemplate();
@Override
public void afterPropertiesSet() {
// Create RabbitMQ management url
this.url = "http://" + rabbitmqfqdn + ":" + rbtmqmgmtport;
// Create http template
template.getInterceptors()
.add(new BasicAuthorizationInterceptor(rbtmqadminname,
rbtmqadminpw));
}
我尝试使用InitializingBean类的@Autowired RestTemplate模板,但它不起作用。我尝试了RestTemplate模板=新的RestTemplate()并且它有效。 RestTemplate模板=新的RestTemplate()是一个猜测,我不知道为什么这个工作。我假设RestTemplate模板= new RestTemplate()是一个可执行文件。任何想法都是为什么这有效。顺便说一下,感谢您的评论。他们让我朝着正确的方向前进。