繁体   English   中英

JAX-RS(球衣实现)ExceptionMapper<Throwable> 没有捕获 ConstraintViolationException

[英]JAX-RS (jersey implementation) ExceptionMapper<Throwable> aren't catching ConstraintViolationException

我有一个ExceptionMapper作为处理我所有ExceptionMapperProvider

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

现在我使用 jax-rs @NotNull来检查我的资源输入值是否为空,并且通过一些搜索,我意识到当注释字段为空时它会抛出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类扩展而来的,所以我错过了什么,为什么它不起作用?

......

通过不起作用,我的意思是它忽略了我的映射器(从ExceptionMapper<Throwable>实现的映射器)并具有正常行为,即返回状态代码 400 没有响应负载,就像根本没有映射器一样

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

在单独的类中执行它的事实对您有用,让我相信某处有一个更具体的ExceptionMapper ,它可以在您之前处理异常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM