xiang yingbing [https://community.jboss.org/people/ybxiang.china] created the discussion
"Why ApplicationException thrown from server-side interceptor is wrapped by JBoss AS/EJB container?" To view the discussion, visit: https://community.jboss.org/message/766555#766555 -------------------------------------------------------------- Dear guys, I defined an application exception and an Intercepter in server side: import javax.ejb.ApplicationException; @ApplicationException(rollback=true) public class *NotExistingSessionTokenException* extends Exception { private static final long serialVersionUID = 1L; public static final NotExistingSessionTokenException INSTANCE; static { INSTANCE = new NotExistingSessionTokenException(); } private static final String MSG = "Fake Session Exception"; private NotExistingSessionTokenException() { super(MSG); } } public class SessionTokenInterceptor { Logger log = Logger.getLogger(SessionTokenInterceptor.class); @PersistenceContext protected EntityManager em; @Resource private EJBContext ejbContext; @AroundInvoke public Object processSessionToken(final InvocationContext invocationContext) throws Exception{ //1. session token //log.info("retrieve SESSION TOKEN from invocation context instead of ejbContext"); String sessionToken = (String)invocationContext.getContextData().get(ServerClientSharedConstants.SESSION_TOKEN_KEY); //log.debug("SESSION_TOKEN:"+sessionToken);//good! //2. JAAS username //log.info("retrieve JAAS username"); String username = ejbContext.getCallerPrincipal().getName();//JAAS username //3. check if(sessionToken==null){ log.error("User["+username+"] has no SESSION TOKEN, so is NOT allowed to do more in this system."); throw NullSessionTokenException.INSTANCE; } if(! isSessionTokenExisting(sessionToken)){ log.error("User["+username+"] is using invalid SESSION TOKEN, so is NOT allowed to do more in this system."); throw *NotExistingSessionTokenException.INSTANCE;* } //4. call original method and return its result so that other interceptor can continue try{ return invocationContext.proceed(); }finally{ } } } I used the interceptor on my session bean: @Interceptors({*SessionTokenInterceptor*.class}) public class SecuredRemoteSession implements ISecuredRemoteSession{ ... } On client side, I catch this exception in an interceptor, but I got a wrapped Exception: javax.ejb.EJBException import java.lang.reflect.UndeclaredThrowableException; import org.apache.log4j.Logger; import org.eclipse.swt.widgets.Display; import org.jboss.ejb.client.EJBClientInterceptor; import org.jboss.ejb.client.EJBClientInvocationContext; import com.ybxiang.nms.common.exception.NotExistingSessionTokenException; public class ClientExceptionInterceptor implements EJBClientInterceptor{ private final static Logger log = Logger.getLogger(ClientExceptionInterceptor.class); @Override public void handleInvocation(EJBClientInvocationContext context) throws Exception { context.sendRequest(); } @Override public Object handleInvocationResult(EJBClientInvocationContext context) throws Exception { String methodName = context.getInvokedMethod().getName(); for(int i=0;i<ignoredMehtods_handleInvocationResult.length;i++){ if(methodName.equals(ignoredMehtods_handleInvocationResult[i])){ return context.getResult(); } } Object result = null; try{ result = context.getResult(); }catch(*NotExistingSessionTokenException* e){ *log.error("NotExistingSessionTokenException is NOT catched!");//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ What I want!* *}catch(javax.ejb.EJBException e){ * if(e.getCause() instanceof java.lang.reflect.UndeclaredThrowableException){ UndeclaredThrowableException cause = (UndeclaredThrowableException)e.getCause(); Throwable t = cause.getUndeclaredThrowable(); if(t instanceof *NotExistingSessionTokenException*){ *log.error("NotExistingSessionTokenException is catched!");//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ What I NOT want!* }else{ log.error("bla bla...); } } else{ } throw e; }catch(Exception e){ log.error("UNknown Exceptoin:",e); throw e; }finally{ } return result; } } Why Application Exception thrown in server-side interceptor is wrapped by EJB container? Thanks in advance. -------------------------------------------------------------- Reply to this message by going to Community [https://community.jboss.org/message/766555#766555] Start a new discussion in EJB3 at Community [https://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2029]
_______________________________________________ jboss-user mailing list jboss-user@lists.jboss.org https://lists.jboss.org/mailman/listinfo/jboss-user