8

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

使用 ExceptionMapper:

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

和参数转换器:

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

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

预期问题:两个提供商都注册了吗?

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

有什么方法可以让 ExceptionMapper 处理来自 ParamConverters 的异常?

我正在使用 jersey 2.3.1 和 spring-jersey,在码头容器 9.1.0.RC0 中启动

4

2 回答 2

6

从阅读这篇文章看来,JAX-RS 规范说实现者应该将未处理的异常包装在NotFoundException(404) for @QueryParamand@PathParam中,并且根据我测试的 400, (我猜BadRequestException) for @FormParam

“如果字段或属性用 注释@MatrixParam@QueryParam或者@PathParam实现必须生成 NotFoundException(404 状态) 的实例,该实例包装抛出的异常并且没有实体”

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

  1. 只需在 中处理它ParamConverter,例如

    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();
        }  
    };
    
  2. 或者只是让你的异常 extend WebApplicationException,然后返回Response那里。例如

    public class MyException extends WebApplicationException {
    
        public MyException(String message) {
            super(Response.serverError().entity(message).build());
        }
    }
    
于 2015-09-13T17:53:59.467 回答
1

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

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

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

要让从 ParamConverter 抛出的异常最终出现在 ExceptionMapper 中,您必须让 ExceptionMapper 捕获更全局的异常,例如 Throwable。

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

于 2017-12-13T00:37:05.653 回答