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
謝謝我的一位同事也提到班上不應該上課。但它絕對存在。 – Stefan