Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
全局JSF异常处理程序不';我不能抓住所有的错误_Jsf_Exception_Ejb_Handler - Fatal编程技术网

全局JSF异常处理程序不';我不能抓住所有的错误

全局JSF异常处理程序不';我不能抓住所有的错误,jsf,exception,ejb,handler,Jsf,Exception,Ejb,Handler,我实现了一个异常处理程序,如本页所述: 遗憾的是,我仍然收到一些错误,这些错误不是由这个解决方案处理的。你知道如何捕捉所有错误吗 我的处理人没有发现这一点: Warnung: A system exception occurred during an invocation on EJB EmailController, method: public void com.x.tool.EmailController.sendAdminNotificationReportRegistration

我实现了一个异常处理程序,如本页所述:

遗憾的是,我仍然收到一些错误,这些错误不是由这个解决方案处理的。你知道如何捕捉所有错误吗

我的处理人没有发现这一点:

Warnung:   A system exception occurred during an invocation on EJB EmailController, method: public void com.x.tool.EmailController.sendAdminNotificationReportRegistration(com.x.JPA.Entity.User) throws java.lang.Exception
Warnung:   javax.ejb.EJBException
    at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
    at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698)
    at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503)
    at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4566)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2074)
    at com.sun.ejb.containers.EjbAsyncTask.call(EjbAsyncTask.java:114)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at com.x.tool.EmailController.sendAdminNotificationReportRegistration(EmailController.java:189)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:55)
    at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52)
    at sun.reflect.GeneratedMethodAccessor96.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
    at sun.reflect.GeneratedMethodAccessor472.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746)
    at com.sun.ejb.containers.EjbAsyncTask.call(EjbAsyncTask.java:101)
    ... 4 more

服务JSF请求时未引发此异常。它是在执行异步EJB服务调用时抛出的。也就是说,运行在不同于服务JSF请求的线程中

由于它是异步执行的,因此无法在返回JSF请求结果的响应中获得任何异常。因此,如果不删除
@Asynchronous
注释使其同步,就不可能让它最终进入JSF错误页面

无论如何,如果将其呈现到错误页面并不那么重要,但实际上您对日志/邮件/任何内容更感兴趣,那么您可以使用拦截器获取(异步)EJB服务调用期间引发的任何异常,如下所示:

public class ExceptionHandlerInterceptor {

    @AroundInvoke
    public Object logExceptions(InvocationContext context) throws Exception {
        try {
            return context.proceed();
        }
        catch (Exception e) {
            // Log/mail/whatever it here.

            throw e; // Don't forget to rethrow!
        }
    }

}
只需将该类放在EJB项目中的某个位置,并通过EJB类上的
@Interceptors
注释注册它

@Stateless
@Interceptors(ExceptionHandlerInterceptor.class)
public class FooService {}
或者通过
/META-INF/EJB jar.xml
中的以下条目在整个EJB项目范围内:

<interceptors>
    <interceptor>
        <interceptor-class>com.example.ExceptionHandlerInterceptor</interceptor-class>
    </interceptor>
</interceptors>
<assembly-descriptor>
    <interceptor-binding>
        <ejb-name>*</ejb-name>
        <interceptor-class>com.example.ExceptionHandlerInterceptor</interceptor-class>
    </interceptor-binding>
</assembly-descriptor>

com.example.ExceptionHandlerInterceptor
*
com.example.ExceptionHandlerInterceptor

这是在ajax请求期间还是在常规HTTP请求期间发生的?遗憾的是,此方法尚未触发。我读到一些关于CDI+接收器不起作用的消息?还有别的办法吗?