Java WebSphere中@PostConstruct异常处理的行为
Short:(Portlet-)容器接受支持bean中@PostConstruct方法引发的异常 这种行为是故意的,是bug还是特定于容器 Long:我正在WebSpherePortal7上运行一个portlet,在这里我强制在PhaseListener中构建托管bean,以便当系统在bean构建/后期构建过程中遇到不可恢复的问题时,它可以将用户发送回起始页 我使用以下代码“强制”施工:Java WebSphere中@PostConstruct异常处理的行为,java,jsf,websphere-7,websphere-portal,postconstruct,Java,Jsf,Websphere 7,Websphere Portal,Postconstruct,Short:(Portlet-)容器接受支持bean中@PostConstruct方法引发的异常 这种行为是故意的,是bug还是特定于容器 Long:我正在WebSpherePortal7上运行一个portlet,在这里我强制在PhaseListener中构建托管bean,以便当系统在bean构建/后期构建过程中遇到不可恢复的问题时,它可以将用户发送回起始页 我使用以下代码“强制”施工: @SuppressWarnings("unchecked") public static <T>
@SuppressWarnings("unchecked")
public static <T> T getManagedBean(final String beanName)
{
final FacesContext context = getFacesContext();
return (T)context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
stacktrace最终出现在RAD(Eclipse)日志中:
但是在我的PhaseListener中没有任何异常可以捕捉,并且它在@PostConstruct期间愉快地继续,而没有意识到异常
这种行为是故意的,是bug还是特定于容器
看起来至少JBoss有类似的处理方式:根据Servlet 3.0规范第15.5.9节: @PostConstruct注释必须由所有 支持依赖项注入和调用,即使类不支持 请求注入任何资源。如果该方法抛出 未经检查的异常该类不得投入使用 可以调用该实例上的方法
如果您看到不同的行为,那么这看起来像是产品缺陷。如果servlet没有投入服务,但异常被吞没,这听起来像是可维护性缺陷。在任何一种情况下,我都建议与IBM建立PMR。请注意,您的服务条款不太可能允许对WebSphere Application Server类进行反编译,即使是出于调试目的。谢谢我的一位同事,他还提到不应将该类放在会话中。但它肯定在那里。
@PostConstruct
public void initialize()
{
throw new RuntimeException("test");
}
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