短い: (Portlet-)Container は、バッキング Bean の @PostConstruct メソッドによってスローされた例外を飲み込みます。
この動作は意図的なものですか、バグですか、それともコンテナー固有ですか?
長文: WebSphere Portal 7 でポートレットを実行しています。このポートレットでは、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 メソッドから RuntimeException をスローしてテストしました
@PostConstruct
public void initialize()
{
throw new RuntimeException("test");
}
スタック トレースは RAD(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 でキャッチする例外はなく、@PostConstruct 中に例外を認識せずに喜んで続行します。
この動作は意図的なものですか、バグですか、それともコンテナー固有ですか?
少なくともJBossには同様の処理方法があるようです: http://www.coderanch.com/t/499013/JSF/java/PostConstruct-exception-handling