我有一个 JEE5 应用程序,它使用(本地) session Bean 公开服务。
当服务执行过程中发生内部错误时,JBoss(5.0.1)会抛出一个RuntimeException,并将其封装在javax.ejb.EJBTransactionRolledbackException中。
问题是接收此 EJBTransactionRolledbackException 的客户端应用程序可以访问有关导致运行时异常的详细信息,从而暴露我的应用程序的内部体系结构。我不希望这样。
相反,我希望 JBoss 始终将公开的 session bean 抛出的 RuntimeException 封装到单个(简单的)TechnicalException(没有原因)中。
实现这一目标的最佳方法是什么? (使用拦截器?使用 JBoss 配置?)
最佳答案
最后,根据之前的回答和我个人的研究,我保留了以下解决方案。
我创建了一个专门用于管理服务器故障的拦截器:
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 {}
我在所有公共(public)服务中使用这个拦截器:
@Stateless
@Interceptors({FaultBarrierInterceptor.class})
public class ShoppingCardServicesBean implements ShoppingCardServices { ...
这是 Fault Barrier pattern 的实现.
任何运行时异常都会被捕获、记录,并使用 TechnicalException 将错误信号发送给客户端(没有内部详细信息)。检查的异常将被忽略。
RuntimeException 处理是集中的,并且与任何业务方法分离。
关于java - 如何对 EJB 客户端隐藏 RuntimeException 详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1037821/