2

I implemented an exception handler like described on this page:

https://wmarkito.wordpress.com/2012/04/05/adding-global-exception-handling-using-jsf-2-x-exceptionhandler/

Sadly I still receive some errors which are not handled by this solution. Do you have any clue how to catch all errors?

This was not catched by my handler:

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
ManuPanu
  • 217
  • 1
  • 3
  • 12

1 Answers1

3

This exception was not thrown while serving a JSF request. It was thrown while executing an asynchronous EJB service call. I.e. running in a different thread than the one serving the JSF request!

As it's executed asynchronously, there's no way to get any exception to end up in the response returning the result of a JSF request. So, it's impossible to get it to end up in a JSF error page without removing the @Asynchronous annotation to make it synchronous.

In any way, if presenting it into an error page is not that important, but you're actually more interested in logging/mailing/whatever it, then you can get hold of any exception thrown during an (asynchronous) EJB service call using an @AroundInvoke interceptor as below:

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!
        }
    }

}

Just put the class somewhere in the EJB project and register it via either @Interceptors annotation on the EJB class,

@Stateless
@Interceptors(ExceptionHandlerInterceptor.class)
public class FooService {}

or EJB project-wide via the below entries in /META-INF/ejb-jar.xml:

<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>
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
  • Sadly this method has not been triggert. I read something about CDI + Inceptors won't work? Is there another way? – ManuPanu Apr 20 '15 at 18:33