2017-05-25 176 views
0

我遇到以下情況,我正在運行到空指針異常,因爲bean未初始化並導致失敗,導致我的服務器無法啓動。 在PostConstruct註釋的方法中有一個新引入的調用失敗。另一種不在PostConstruct中的方法正在執行相同的調用,該方法正確執行並且不會引起任何問題。Spring bean未注入

@Component 
@Lazy 
@Primary 
class Parent{ 
@Autowired 
private DesignContextService designContextService; 

@PostConstruct 
private void init(){ 
     designContextService.getMethod();// fails 
} 

private void someFunction(){ 
     designContextService.getMethod();// executes successfully 
} 
} 

} 

Class DesignContextService{ 
@Autowired 
private ContextService contextService; 

public void getMethod(){ 
    contextService.isContextCreated(); 
    ... 
} 
// Below classes present in another jar 
class ContextService{ 
    @Inject 
    public ContextAdapter contextAdapter; 

    public void isContextCreated(){ 
    contextAdapter.isEstablished();// contextAdapter is null . Throws exception here 

} 

} 

} 

錯誤堆棧跟蹤:

at 
Caused by org.springframework.beans.factory.BeanCreationException : Error creating bean ... 

at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:137) 



at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409) 

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620) 
+0

是'Parent'定義爲一個Spring bean?依賴注入只適用於Spring bean,不適用於不是Spring bean的其他類。另外,當你使用'new'創建類的實例時,它不起作用;你需要讓Spring管理這些bean。 – Jesper

+0

是的。我將糾正示例代碼。 – jetty

+0

'class DesignContextService'也應該用'@Service'或'@ Component'註釋,以便Spring能夠正確自動裝載它。也許這是你的問題? – mingos

回答

0

這是因爲@Lazy註釋。如文檔中所述:

ApplicationContext實現的默認行爲是在啓動時急切地預先實例化所有的singleton bean。預實例化意味着一個ApplicationContext會急切地創建和配置所有的單例bean作爲其初始化過程的一部分。一般來說,這是一件好事,因爲這意味着配置或周圍環境中的任何錯誤都會立即被發現(相對於可能的幾小時甚至幾天)。

請查看以下鏈接以供參考:Using Spring @Lazy and @PostConstruct annotations

Spring: how to initialize related lazy beans after main bean creation

+0

試圖刪除懶惰的註釋。這個問題沒有解決。 :( – jetty