Spring构造函数问题

时间:2017-03-02 16:50:25

标签: java spring

我在为@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() ...

3 个答案:

答案 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()是一个可执行文件。任何想法都是为什么这有效。顺便说一下,感谢您的评论。他们让我朝着正确的方向前进。