最后,根据之前的回答和我个人的研究,我保留了以下解决方案。
我创建了一个专门用于管理服务器故障的拦截器:
public class FaultBarrierInterceptor {
@AroundInvoke
public Object intercept(final InvocationContext invocationContext) throws Exception {
try {
return invocationContext.proceed();
} catch (final RuntimeException e) {
final Logger logger = Logger.getLogger(invocationContext.getMethod().getDeclaringClass());
logger.error("A fault occured during service invocation:" +
"\n-METHOD: " + invocationContext.getMethod() +
"\n-PARAMS: " + Arrays.toString(invocationContext.getParameters()), e);
throw new TechnicalException();
}
}}
抛出的技术异常扩展了 EJBException 并且不暴露原因 RuntimeException:
public class TechnicalException extends EJBException {}
我在所有公共服务中使用这个拦截器:
@Stateless
@Interceptors({FaultBarrierInterceptor.class})
public class ShoppingCardServicesBean implements ShoppingCardServices { ...
这是故障屏障模式的实现。
任何运行时异常都会被捕获、记录并使用 TechnicalException 向客户端发出错误信号(没有内部细节)。已检查的异常将被忽略。
RuntimeException 处理是集中的,并与任何业务方法分开。