0

我正在为 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。;)

4

1 回答 1

3

您的toResponse-method 包含一些冲突的逻辑。

Response.status(Status.NO_CONTENT).entity(cause.getMessage());

在这里,您正在分配 HTTP 状态代码204 No Content,但您也正在添加响应。您不能同时将状态设置为204 No Content并返回响应正文。

此外,如果Exception#getCause()为 null 或不是的实例NoDeliveryFoundException,则响应正文为空。

这可能是您的问题的原因吗?

于 2013-09-22T09:21:07.380 回答