2014-10-20 199 views
6

我在Spring Boot項目中有幾個類,有些使用@Autowired,有些不使用。在這裏我的代碼如下:Spring Boot Autowired null

Application.java(@Autowired作品):

package com.example.myproject; 

@ComponentScan(basePackages = {"com.example.myproject"}) 
@Configuration 
@EnableAutoConfiguration 
@EnableJpaRepositories(basePackages = "com.example.myproject.repository") 
@PropertySource({"classpath:db.properties", "classpath:soap.properties"}) 
public class Application { 

@Autowired 
private Environment environment; 

public static void main(String[] args) { 
    SpringApplication.run(Application.class); 
} 

@Bean 
public SOAPConfiguration soapConfiguration() { 
    SOAPConfiguration SOAPConfiguration = new SOAPConfiguration(); 
    SOAPConfiguration.setUsername(environment.getProperty("SOAP.username")); 
    SOAPConfiguration.setPassword(environment.getProperty("SOAP.password")); 
    SOAPConfiguration.setUrl(environment.getProperty("SOAP.root")); 
    return SOAPConfiguration; 
} 

的HomeController(@Autowired作品):

package com.example.myproject.controller; 

@Controller 
class HomeController { 

    @Resource 
    MyRepository myRepository; 

爲MyService(@Autowired不工作):

package com.example.myproject.service; 

@Service 
public class MyServiceImpl implements MyService { 

    @Autowired 
    public SOAPConfiguration soapConfiguration; // is null 

    private void init() { 
    log = LogFactory.getLog(MyServiceImpl.class); 
    log.info("starting init, soapConfiguration: " + soapConfiguration); 
    url = soapConfiguration.getUrl(); // booom -> NullPointerException 

我沒有得到SOAPConfiguration,但我的應用程序打破空指針異常,當我嘗試訪問它。

我已經在這裏閱讀了許多主題,並且搜索了一些內容,但是還沒有找到解決方案。我試圖提供所有必要的信息,請讓我知道是否有遺漏。

+0

從哪裏調用'init'方法?我懷疑構造函數。 – 2014-10-20 08:49:23

+0

log.info打印:啓動init,soapConfiguration:null – dexBerlin 2014-10-20 08:51:18

+0

HomeController.update創建一個新的MyServiceImpl並調用myService.update,它調用它的init方法。 – dexBerlin 2014-10-20 08:53:36

回答

8

我想你在自動裝配發生之前打電話給init()。使用@PostConstruct註釋init()以在所有彈簧自動裝配後自動調用。

編輯:看到你的評論後,我想你正在使用new MyServiceImpl()創建它。這將從Spring中取消對MyServiceImpl的控制並將其提供給您。在這種情況下,自動裝配將不起作用

+0

我添加了@PostContruct註釋,但soapConfiguration仍然爲空。 – dexBerlin 2014-10-20 08:57:30

+0

查看編輯答案 – sinu 2014-10-20 08:58:40

+0

非常感謝,這解決了我的問題。 – dexBerlin 2014-10-20 09:03:24

1

您是否在任何配置類中爲類SOAPConfiguration創建了一個bean?如果你想在你的項目中自動裝載一個類,你需要爲它創建一個bean。例如,

@Configuration 
public class SomeConfiguration{ 

    @Bean 
    public SOAPConfiguration createSOAPConfiguration(){ 

     return new SOAPConfiguration(); 
    } 

} 

public class SomeOtherClass{ 

    @Autowired 
    private SOAPConfiguration soapConfiguration; 
} 
+0

Application.java應該這樣做?在我的解釋中? – dexBerlin 2014-10-20 08:55:36

+0

您確定您的Application.java上的方法調用了SOAPConfiguration嗎? – furkan3ayraktar 2014-10-20 09:00:15