2012-11-22 52 views
9

我想在我的代碼中捕獲bean實例化異常。我有什麼選擇? 一種方式做,這是使用基於Java的容器配置:Spring - 捕獲Bean創建異常

@Configuration 
public class AppConfig { 
    @Bean 
    public SomeBean someBean() { 
    try { 
     return new SomeBean(); // throws SomeException 
    } catch(SomeException se) { 
     return new SomeBeanStub(); 
    } 
    } 
} 

這有可能使用Spring使用基於註解的基於XML的或配置定義bean的實例化異常處理程序?

+0

你有沒有找到辦法做到這一點?我想抓住它,並殺死進程,而不是讓服務器加載它。我的問題是,如果某個bean沒有正確加載,但其他bean卻會出現不一致的行爲。 –

回答

0

你不會這麼做。這就是讓Spring爲你創建一個bean的關鍵。如果要使用new(如上所述)創建自己的bean,爲什麼使用Spring爲您創建bean?

你確實可以爲你自己分配對象並一起工作,而不是依賴注入和全部。

雖然我理解問題背後的本質。我認爲最好是在服務器加載時間內失敗。原因:應用程序不會處於不一致的狀態。假設你發現了異常並且做了一些清潔工作,但是其他的類會期望這個bean存在,否則它就不存在。

因此,最好在初始化時失敗,以便應用程序保持一致。雖然我不知道任何其他合法的做法。

+0

謝謝。問題的上下文如下:如果在bean的實例化(數據庫失敗,另一個外部錯誤)期間發生錯誤,則應該切換到某種維護模式。如果不捕獲bean創建例外,這是不可能的。你能否詳細說明一下包裝如何在這裏提供幫助? – khachik

+1

編輯答案:) – Jatin

2

只是爲了完整。

您也可以懶惰地初始化bean並在第一次使用bean時捕獲異常。

Spring配置:

<bean id="a" class="A" lazy-init="true" /> 

在java中:

import org.springframework.beans.factory.BeanCreationException; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Lazy; 

public class B { 

    @Autowired 
    @Lazy 
    A a; 

    public void foo(){ 
     try{ 
       a.foo(); 
     } catch (BeanCreationException e){ 
       // ignore if you want 
     } 
    } 
} 
8

方法someBean應該抓住SomeException,然後用SomeExceptionBeanCreationException的原因:

@Configuration 
public class AppConfig { 
    @Bean 
    public SomeBean someBean() { 
    try { 
     return new SomeBean(); // throws SomeException 
    } catch (SomeException se) { 
     throw new BeanCreationException("someBean", "Failed to create a SomeBean", se); 
    } 
    } 
} 
+0

這是正確的做法。 – Alex

0

在情況下,如果你期待失敗期間創建和bean對於應用程序的其餘部分(非常合理的情況)不是強制性的,您可以按照您的建議,通過捕獲@Bean方法主體中的所有失敗異常並返回null來指示創建bean失敗。 在這種情況下,bean不會被添加到Spring應用程序上下文中,並且如果給定的bean沒有強制的依賴關係,則上下文構造將成功。