代码之家  ›  专栏  ›  技术社区  ›  Seyed Ali Roshan

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

  •  1
  • Seyed Ali Roshan  · 技术社区  · 7 年前

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

    很明显,我的类实现了 ExceptionMapper<Throwable> 我们知道,所有的例外都是扩展的 Throwable 不知怎么的。

    现在我用jax-rs @NotNull 为了检查我的资源输入值是否不为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> 在那里处理,没有任何问题。

    正如我之前所说(也检查过)所有的异常都是从 可抛出 不知怎的,我错过了什么?为什么它不起作用?

    ......

    我的意思是它忽略了我的映射器(从 )并且有正常的行为,即返回状态码400,没有响应负载,就像根本没有映射器一样

    1 回复  |  直到 7 年前
        1
  •  1
  •   SBylemans    7 年前

    就像 ExceptionMapper 你可以创建一个 ExceptionMapper<Throwable> ,它处理所有错误。然后你可以创建更具体的 它以另一种方式处理更具体的错误。所有这些都在不同的班级里。

    事实上,在一个单独的课堂上做这件事对你来说很有效,让我相信有一个更具体的方法 例外情况

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

    推荐文章