我正在为 EJB 服务开发 REST 外观,这意味着它调用 EJB,将结果转换为 REST 调用者将理解的表示,然后返回它(作为 json 或 xml)。所有这些都非常出色。但是 EJB 服务会引发各种异常,例如,当没有找到结果或其他一些不同的情况时。因为我不希望那些传播到 REST 调用者,所以我实现了一个 ExceptionMapper:
public class EjbExceptionMapper implements ExceptionMapper<EJBException> {
private static final Logger logger = LoggerFactory.getLogger(EjbExceptionMapper.class);
@Override
public Response toResponse(final EJBException exception) {
ResponseBuilder result = Response.status(Status.BAD_REQUEST);
logger.debug("Bad request:", exception);
if (exception.getCause() != null) {
final Throwable cause = exception.getCause();
if (cause instanceof NoDeliveryFoundException) {
logger.debug("Found NoDeliveryFoundException:", cause);
result = Response.status(Status.NO_CONTENT).entity(cause.getMessage());
}
}
return result.build();
}
}
我的 EJB 服务中的所有异常都以. 的形式javax.ejb.EJBException
出现,这个 Mapper 设法很好地捕捉到这些异常,应用程序的不同自定义异常作为原因。计划是根据 EJBException 的原因类型返回不同的响应。用于调试的记录器调用都在我得到 NoDeliveryFoundException 作为原因的情况下执行,所以我知道它已执行(映射器已正确注册并用于映射),但客户端永远不会看到响应。
在底层服务中导致 EJBException 的每个调用(因此使用此 ExceptionMapper)根本不会导致任何响应,就好像 toResponse() 方法返回 null 而不是自定义构建的响应一样。
我什至在返回之前记录了响应,它存在并且包含我所期望的,所以我很肯定它是由 toResponse 方法返回的。但是,我的客户仍然没有收到任何响应。
所以现在我被难住了,因为没有搜索能够找到描述类似问题的人,所以我求助于你,亲爱的 SO。;)