2012-06-21 50 views
3

Short:(Portlet-)Container swallows由後臺bean中的@PostConstruct方法引發的異常。行爲在WebSphere中執行@PostConstruct異常處理

此行爲是故意的,是一個錯誤還是容器特有的?

長:我在WebSphere Portal 7上運行一個portlet,在那裏我強制在一個PhaseListener中管理bean的構造,這樣當系統在Bean構建/構建過程中遇到不可恢復的問題時,它可以將用戶發回到開始頁面。

我使用以下代碼來 '力' 結構:

@SuppressWarnings("unchecked") 
public static <T> T getManagedBean(final String beanName) 
{ 
    final FacesContext context = getFacesContext(); 
    return (T)context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class); 
} 

我測試從@PostConstruct方法

@PostConstruct 
public void initialize() 
{ 
    throw new RuntimeException("test"); 
} 

的堆棧跟蹤在RAD結束投擲一個RuntimeException(Eclipse的)日誌:

com.ibm.ws.webcontainer.annotation.WASAnnotationHelper doInvoke unable to invoke method --> [initialize] on class --> [foo.bar.UpdateAddress] 
          java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
at java.lang.reflect.Method.invoke(Method.java:611) 
at com.ibm.ws.webcontainer.annotation.WASAnnotationHelper.doInvokeSingle(WASAnnotationHelper.java:432) 
at com.ibm.ws.webcontainer.annotation.WASAnnotationHelper.doInvokeChain(WASAnnotationHelper.java:400) 
at com.ibm.ws.webcontainer.annotation.WASAnnotationHelper.doPostConstruct(WASAnnotationHelper.java:220) 
at com.sun.faces.vendor.WebSphereInjectionProvider.invokePostConstruct(WebSphereInjectionProvider.java:86) 
at com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:225) 
... 
Caused by: java.lang.RuntimeException: test 
    at foo.bar.UpdateAddress.initialize(UpdateAddress.java:119) 
    ... 121 more 

但是,沒有例外,趕上我的PhaseListener和它h在@PostConstruct期間不會意識到異常而繼續使用。

此行爲是故意的,是一個錯誤還是容器特有的?

看起來至少JBoss已經處理類似的方式:http://www.coderanch.com/t/499013/JSF/java/PostConstruct-exception-handling

回答

2

每Servlet 3.0規範第15.5.9:

的@PostConstruct標註必須在各個階層的支持是 支持依賴注入並被調用,即使該類沒有請求任何要注入的資源 。如果該方法拋出 未經檢查的異常,則該類不得投入使用,並且不能在該實例上調用 方法。

如果您看到不同的行爲,那麼這看起來像是產品缺陷。如果servlet沒有投入使用,但是異常被吞下,這聽起來像是可用性缺陷。無論哪種情況,我都會建議與IBM開一個PMR。請注意,即使出於調試目的,您的服務條款也不可能允許反編譯WebSphere Application Server類。

+0

謝謝我的一位同事也提到班上不應該上課。但它絕對存在。 – Stefan