exception-handling - Jersey ParamConverter 异常未由 ExceptionMapper 处理

标签 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();
    }
}

和参数转换器:
@Provider 
(boilerplate junk)
    @Override
    public DateTime fromString(String value) {
        throw new MyException("convert");
    }

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

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

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

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

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

最佳答案

来自阅读 this ,JAX-RS 规范说实现者应该将未处理的异常包装在 NotFoundException 中。 (404) 为 @QueryParam@PathParam ,从我测试 400 的结果来看,(我猜是 BadRequestException )为 @FormParam .

"if the field or property is annotated with @MatrixParam, @QueryParam or @PathParam then an implementation MUST generate an instance of NotFoundException (404 status) that wraps the thrown exception and no entity"



我可以看到处理异常的几种方法是
  • 只需在 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();
        }  
    };
    
  • 或者只是让您的异常(exception)扩展 WebApplicationException ,并返回 Response那里。例如
    public class MyException extends WebApplicationException {
    
        public MyException(String message) {
            super(Response.serverError().entity(message).build());
        }
    }
    
  • 关于exception-handling - Jersey ParamConverter 异常未由 ExceptionMapper 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19825795/

    相关文章:

    java - 使用 Jersey 查询参数验证

    web-services - 如何更好地将 Jersey restful 启用类之间的对象传输到 JSP 页面

    jakarta-ee - 无法从 ExceptionMapper 捕获 ConstaintValidationException

    c# - 从 App.config 获取连接字符串

    c++ - 捕获我在 Objective-C 中调用的 C++ 函数的异常?

    java - 在 'try' block 中调用不抛出异常的方法

    java - JAXB - 类集合的 PascalCase 包装器

    javascript - 未捕获异步 javascript 中引发的异常

    java - Jersey 的动态实例级授权(基于 id)

    java - Apache cxf Jax-RS 2.0 拦截器