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");
}
}
我正在研究拦截器和装饰器,在使用它进行试验时我遇到了一个问题,如果我从拦截器抛出一个已检查的异常,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");
}
}