EJB 包装了我从拦截器抛出的 customExceptions

EJB wraps my customExceptions throwed from interceptors

我正在研究拦截器和装饰器,在使用它进行试验时我遇到了一个问题,如果我从拦截器抛出一个已检查的异常,EJBContainer 会将它包装为 EJBException,而不是我想显示给客户是我的自定义例外。

假设我有一个简单的方法和一个拦截器来检查参数是否有效,如下所示:

@Interceptor 
public class TestIntercepor {
    
    @AroundInvoke
    public Object test(InvocationContext invCtx) throws Exception{ 
        
        try {
        
        //check parameters...
         
        return invCtx.proceed(); 
        
        } catch (CustomException ex) {
            throw new CustomException();
        } catch (Exception ex) {
            throw new Exception();
        }
        
    }

}

如果出现问题,我想抛出的异常是 CustomException:

public class CustomException extends Exception {

    public CustomException() {
        super("ERROR! Input fields not valid");
    }

}

现在我注意到在我的 SOAP 错误消息中抛出的异常是 EJBException。我做了一些研究,发现 EJB 容器包装了所有抛出的 SystemException,所以我假设拦截器抛出的 CustomException 由于某种原因被视为未处理的异常,而如果我从业务方法中抛出相同的异常, 客户端在消息中看到正确的异常。

我什至尝试在我的 CustomException class 中添加 @ApplicationException 注释,以完全确定我的异常必须被视为 ApplicationException 而不是 SystemException,但它似乎没有正在工作。

有什么我想念的吗?

我发现如果您的自定义异常扩展了 RuntimeException 而不是 Exception,它就可以工作。似乎 @ApplicationException 只有在异常是像 RuntimeException 这样的系统异常时才起作用,而不是在扩展正常异常时才起作用。

@ApplicationException(rollback = true)
public class CustomException extends RuntimeException {

    public CustomException() {
        super("ERROR! Input fields not valid");
    }

}