JAX-RS(泽西实现)ExceptionMapper 没有捕获ConstraintViolationException

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAX-RS(泽西实现)ExceptionMapper 没有捕获ConstraintViolationException相关的知识,希望对你有一定的参考价值。

我有一个ExceptionMapper作为Provider来处理我的所有异常。

很明显,我的类实现了ExceptionMapper<Throwable>,我们知道,所有异常都以某种方式扩展了Throwable

现在我使用jax-rs @NotNull检查我的资源输入值是否为null并且通过一些搜索,我意识到当注释字段为null时它会抛出ConstraintViolationException

所以我试着处理它并在我的ExceptionMapper中添加一些响应(添加一些自定义json模型)的细节,如下所示:

@Provider
public class AllExceptionMapper implements ExceptionMapper<Throwable> {

    private final Logger logger = LogManager.getLogger(AllExceptionMapper.class);

    @Override
    public Response toResponse(Throwable ex) {
        Response response;
        CustomError error;
        // handle some errors

        else if (ex instanceof ConstraintViolationException) {
             error = new CustomError(
                 324, // predefined error type in our documents
                 "some details"
             );
             response = Response.status(Response.Status.BAD_REQUEST).entity(error).build();
        }

        // handle some other errors

        return response;
    }

}

问题是这不起作用,但如果我要创建另一个实现ExceptionMapper<ConstraintViolationException>并在那里处理它的异常映射器提供程序,它的工作没有任何问题。

正如我之前所说(并且还检查过)所有异常都以某种方式从Throwable类扩展,所以我错过了什么以及为什么它不起作用?

......

由于没有工作,我的意思是它忽略了我的mapper(从ExceptionMapper<Throwable>实现的那个)并且具有正常行为,它返回状态代码400而没有响应有效负载,就像根本没有映射器一样

答案

ExceptionMapper的工作方式是,您可以创建一个通用的ExceptionMapper<Throwable>,它可以处理所有错误。然后你可以创建更具体的ExceptionMappers,以另一种方式处理更具体的错误。所有这些都在不同的课程中。

事实上,在一个单独的类中为你工作,让我相信在某个地方有一个更具体的ExceptionMapper,它可以在你可以之前处理异常。

ExceptionMappers的使用方式实际上非常干净,并且还可以保持代码清洁。想要将代码保存在一个中心位置,将导致巨大的if ......

以上是关于JAX-RS(泽西实现)ExceptionMapper 没有捕获ConstraintViolationException的主要内容,如果未能解决你的问题,请参考以下文章

AsyncResponse ConnectionCallback 不会在泽西岛触发

使用 JAX-RS Jersey 进行身份验证和授权的简便方法

使用 JAX-RS Jersey 进行身份验证和授权的简便方法

泽西岛,如何发布 JSON 对象列表?

什么是 JAX-RS 实现?

Spring Rest 是 JAX-RS 的实现还是 Spring Rest 使用啥实现来支持 REST?