java - JAX-RS( Jersey 实现)ExceptionMapper<Throwable> 未捕获 ConstraintViolationException

标签 java jersey exceptionmapper

我有一个ExceptionMapper作为@Provider用于处理我的所有异常。

所以很明显我的类实现了 ExceptionMapper<Throwable>众所周知,所有异常(exception)情况均已延长 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以另一种方式处理更具体的错误。所有这些都在不同的类(class)中进行。

事实上,在一个单独的类中完成它对你来说是有效的,让我相信有一个更具体的 ExceptionMapper某个地方,它会先于你处理异常。

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

关于java - JAX-RS( Jersey 实现)ExceptionMapper<Throwable> 未捕获 ConstraintViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53063143/

相关文章:

java - Mysql 驱动程序错误(泽西 Tomcat)

java - 使用 POST 方法的 Web 服务响应 "Unsupported Media Type"

java - 为什么 CORSFilter 与 ExceptionMapper<Throwable> 冲突?

json - Jersey 无法捕获任何 jackson 异常

java - JAX-RS PathParam 不工作

java - 未调用 Jersey ExceptionMapper

java - 生成 long 类型的 UUID

java - JFrame布局管理

java - 无法通过长 ID 删除实体

Java Swing Mac OSX 首选项菜单