Jersey ParamConverter异常不是由ExceptionMapper处理的

时间:2013-11-07 00:35:36

标签: exception-handling jersey jax-rs jersey-2.0

每个标题,从ParamConverter抛出的异常不按我期望的方式处理。

使用ExceptionMapper:

@Provider
public class MyExceptionMapper implements ExceptionMapper<MyException> {
    @Override
    public Response toResponse(MyException exception) {
        return Response.serverError().entity( "It triggered" ).build();
    }
}

和ParamConverter:

@Provider 
(boilerplate junk)
    @Override
    public DateTime fromString(String value) {
        throw new MyException("convert");
    }

它不会在500错误中返回“It triggered”文本,而是返回404。

预期的问题:两家供应商都注册了吗?

是 - 如果我从资源(在“常规”代码中)抛出“MyException”,它将按预期工作。我也可以使用“转换”消息转换看堆栈跟踪。

有没有办法让ExramMapper处理ParamConverters的异常?

我正在使用球衣2.3.1,以及弹力球衣,在码头容器中发射9.1.0.RC0

2 个答案:

答案 0 :(得分:2)

从阅读this看来,JAX-RS规范说实现者应该在NotFoundException@QueryParam的{​​{1}}(404)中包含未处理的异常,以及我为@PathParam测试了400,(我猜测BadRequestException)。

  

&#34;如果字段或属性使用@FormParam@MatrixParam@QueryParam进行注释,则实现必须生成一个实例   @PathParam(404状态)包装抛出的异常而没有实体&#34;

我可以看到处理异常的几种方法是

  1. 只需在NotFoundException处理,例如

    ParamConverter
  2. 或者只是将您的例外扩展为WebApplicationException,并在那里返回return new ParamConverter<T>() { @Override public T fromString(String string) { try { return (T)new MyObject().setValue(string); } catch (MyException ex) { Response response = Response.serverError().entity("Boo").build() throw new WebApplicationException(response); } } @Override public String toString(T t) { return t.toString(); } }; 。 e.g。

    Response

答案 1 :(得分:0)

我在Jersey 2.26中遇到了同样的行为。

任何扩展RuntimeException的异常都会映射到ParamException,而ParamException本身就是WebApplicationException的一个子级。 假设您的MyException扩展了RuntimeException,它不会被捕获,因为您的ExceptionMapper只处理MyException。

关于Jersey文档说要抛出一个NotFoundException:我认为当一个queryParam无法转换时,404不适用。 BadRequestException似乎更合适。而且,除了设置响应代码之外,在抛出NotFoundException时,我看不到Jersey框架中的任何唯一内容

要在ExceptionMapper中获得从ParamConverter抛出的异常,你必须让你的ExceptionMapper捕获一个更全局的异常,比如Throwable。

另一个答案建议返回WebApplicationException。这应该是一个很好的解决方案,但如果Response对象有一个实体,它将不起作用。见这里:https://github.com/jersey/jersey/issues/3716