简短:( 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
答案 0 :(得分:2)
根据Servlet 3.0规范的第15.5.9节:
@PostConstruct注释必须得到所有类的支持 支持依赖注入并调用,即使该类没有 请求注入任何资源。如果方法抛出一个 未经检查的异常该类不得投入使用而不是 可以调用该实例上的方法。
如果您看到不同的行为,那么这看起来就像是产品缺陷。如果servlet没有投入使用但是吞下了异常,这听起来像是一个可服务性缺陷。在任何一种情况下,我都建议与IBM合作开设PMR。请注意,即使出于调试目的,您的服务条款也不太可能允许反编译WebSphere Application Server类。