WebSphere中@PostConstruct异常处理的行为

时间:2012-06-21 17:19:53

标签: java jsf websphere-7 websphere-portal postconstruct

简短:( Portlet-)容器吞下由支持bean中的@PostConstruct方法引发的异常。

这种行为是故意的,还是特定的错误或容器?

Long:我在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方法抛出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

1 个答案:

答案 0 :(得分:2)

根据Servlet 3.0规范的第15.5.9节:

  

@PostConstruct注释必须得到所有类的支持   支持依赖注入并调用,即使该类没有   请求注入任何资源。如果方法抛出一个   未经检查的异常该类不得投入使用而不是   可以调用该实例上的方法。

如果您看到不同的行为,那么这看起来就像是产品缺陷。如果servlet没有投入使用但是吞下了异常,这听起来像是一个可服务性缺陷。在任何一种情况下,我都建议与IBM合作开设PMR。请注意,即使出于调试目的,您的服务条款也不太可能允许反编译WebSphere Application Server类。