与实体一起抛出的 WebApplicationExceptions 的 ExceptionMapper?

ExceptionMapper for WebApplicationExceptions thrown with entity?

在我们的(遗留)代码库中,我们以不同的方式抛出 WebApplicationExceptions。 为了对我们处理异常的方式进行排序 - 我想为这些 WAE(和其他)创建一个 ExceptionMapper。

然而,我意识到 Jersey 的 ExceptionMapper 只映射未随实体一起抛出的 WAE。

例如:

throw new WebApplicationException(Response.status(500).build());

此异常被 ExceptionMapper 捕获。

throw new WebApplicationException(Response.status(500).entity(WsResourceUtils.createWSResourceRestError(500, "bla")).build());

ExceptionMapper 未捕获此异常。

两者都是从代码中的同一点抛出的。

这是我的 ExceptionMapper:

@Provider
public class GeneralExceptionMapper implements ExceptionMapper<Throwable> {

    private static final Logger logger = LoggerFactory.getLogger(GeneralExceptionMapper.class);

    @Override
    public Response toResponse(Throwable e) {
        logger.error("Caught a WAE", e);
...
}

是否可以创建一个 ExceptionMapper 来捕获 WebApplicationExceptions,即使它们的响应已经用实体构建?

我们正在使用 Jersey 1.17。

谢谢。

请考虑查看 GIST 中的代码:

https://gist.github.com/jeorfevre/9fb2c447a01bcc724998

  1. 注册一个包含 Response 的 MagicException 映射器
  2. 定义包含响应的异常
  3. 抛出这个异常