3

短い: (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

4

1 に答える 1

3

サーブレット 3.0 仕様のセクション 15.5.9 によると:

@PostConstruct アノテーションは、依存性注入をサポートするすべてのクラスでサポートされ、クラスがリソースの注入を要求していない場合でも呼び出されなければなりません。メソッドがチェックされていない例外をスローする場合、クラスをサービスに入れてはならず、そのインスタンスのメソッドを呼び出すことはできません。

異なる動作が見られる場合、これは製品の欠陥のようです。サーブレットがサービスに入れられていないのに例外が飲み込まれている場合、これは保守性の欠陥のように思えます。どちらの場合でも、IBM で PMR を開くことをお勧めします。デバッグ目的であっても、WebSphere Application Server クラスの逆コンパイルがサービス条件で許可されている可能性は低いことに注意してください。

于 2012-06-25T13:53:18.977 に答える