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

时间:2018-10-30 11:18:18

标签: java jersey exceptionmapper

我有一个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类扩展了,所以我错过了什么,为什么它不起作用?

......

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

1 个答案:

答案 0 :(得分:1)

应该使用def create @post = Post.new(post_params) if @post.save flash[:notice] = "Successfully created post!" redirect_to post_path(@post) else flash[:alert] = "Error creating new post!" render :new end end 的方式是,您可以创建一个通用的ExceptionMapper来处理所有错误。然后,您可以创建更具体的ExceptionMapper<Throwable>,以另一种方式处理更具体的错误。所有这些都在单独的类中。

在单独的类中进行操作的事实为您服务,这让我相信,在某个地方有一个更具体的ExceptionMapper,可以在可能的情况下处理该异常。

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