2

我有一个ExceptionMapperas a@Provider来处理我的所有异常。

所以很明显,我的类实现了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 没有响应有效负载,就像根本没有映射器一样

4

1 回答 1

2

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

在单独的课程中执行此操作对您有用,让我相信有一个更具体的ExceptionMapper地方可以在您之前处理异常。

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

于 2018-10-30T12:04:27.363 回答