Java 与实体一起引发的WebApplicationException异常的ExceptionMapper?

Java 与实体一起引发的WebApplicationException异常的ExceptionMapper?,java,jersey,jax-rs,Java,Jersey,Jax Rs,在我们的(遗留)代码库中,我们以不同的方式抛出WebApplicationException。 为了对我们如何处理异常进行排序,我想为这些WAE(和其他WAE)创建一个ExceptionMapper 然而,我意识到,Jersey的ExceptionMapper只映射了WAE,而不是与实体一起抛出的 例如: throw new WebApplicationException(Response.status(500).build()); 此异常被ExceptionMapper捕获 throw ne

在我们的(遗留)代码库中,我们以不同的方式抛出WebApplicationException。 为了对我们如何处理异常进行排序,我想为这些WAE(和其他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未捕获此异常

throw new WebApplicationException(Response.status(500).entity(WsResourceUtils.createWSResourceRestError(500, "bla")).build());
两者都是从代码中的同一点抛出的

这是我的例外:

@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);
...
}
@Provider
公共类GeneralExceptionMapper实现ExceptionMapper{
私有静态最终记录器Logger=LoggerFactory.getLogger(GeneralExceptionMapper.class);
@凌驾
公众响应(可丢弃的e){
记录器错误(“捕捉到一个WAE”,e);
...
}
是否可以创建一个ExceptionMapper来捕获WebApplicationException,即使它们的响应已经用实体生成

我们用的是泽西1.17


谢谢。

< P>请考虑GIST中的代码:

  • 注册包含响应的MagiceException的映射器
  • 定义包含响应的异常
  • 抛出此异常

  • 1.此解决方案要求我更改抛出WebApplicationException的每个位置,改为抛出MagiceException。2.您没有处理主要问题-MagiceException中仍有一个实体集,因此映射程序仍不会捕获它。这与我所做的有何不同?我已经有一个异常映射程序,但它没有“无法捕获已与实体一起抛出的WAE。因为您看不到,我将在下次修改代码。此解决方案需要稍加调整即可工作-WebApplicationException.getResponse是最终方法,因此无法重写。我需要为response对象创建单独的getter,并且仅使用该getter在mapp中提取响应。”呃。不幸的是,这迫使我使用反射来确定对象是否为继承类型,但我想这总比没有好。你对如何处理这个问题有其他想法吗?有很多方法来管理这种行为。但只有反射才能生成一个漂亮、干净、易于维护的代码。享受:)2年后,这是s在Jersey 2.26出现问题之前,很抱歉恢复了一个将近三年的线程,但RestEasy 3.0.11也展示了这一点。如果我在没有实体的情况下创建WAE,我的映射器将被调用。如果我使用实体创建WAE,我的映射器将永远看不到它。也许这是JAX-RS中定义的?