2017-03-02 179 views
-1

我无法为@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

这与Spring无关。这只是一个很好的旧NPE。你不能在一个你尚未初始化的变量上调用一个方法。 –

+0

除非它是一个静态方法! –

+0

尝试静态但仍NPE错误。 – skmansfield

回答

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)); 

} 

我试图@Autowired RestTemplate模板用的InitializingBean类,并没有奏效。我试过RestTemplate模板=新RestTemplate(),它的工作。 RestTemplate模板=新的RestTemplate()是一个猜测,我不知道为什么这个工作。我假设RestTemplate template = new RestTemplate()是一个可执行文件。任何想法都是为什么这个工作。顺便说一句,感谢您的意见。他们让我朝着正确的方向前进。

0

您购买的NPE因为template为空。你需要自动装配RestTemplate

@Autowired 
RestTemplate template; 
+0

我试过@Autowired RestTemple,但仍然得到NPE错误。 – skmansfield

+2

@skmansfield,因为在构造对象之前Spring不能注入对象的字段。构造函数是构造对象的东西。所以autowired字段在构造函数中是null。使用构造函数注入(首选),和/或使用'@ PostConstruct'(阅读文档以了解如何)。但无论如何,组件的构造函数不应该配置一个自动装配的RestTemplate。这应该在创建RestTemplate时完成。或者组件应该有它自己的RestTemplate。 –

+0

我同意@JBNizet。试试看。它必须工作。 – VHS

0

而不是使用一个构造函数,你最好使用@PostConstruct注解。这不是Spring注释,但它位于J2EE库中。

默认情况下,Spring没有注意到这个注解。您必须在您的配置中注册它。添加

<context:annotation-config /> 

要将configuration.xml中

@PostConstruct 
private void init() { 
    // init your Spring bean here.. 
} 

init方法被称为豆构造之后。此时,你应该确保你的bean中的所有东西都是自动装配的。不要忘记自动装载你在其上得到NullPointerException的RestTemplate。