每个标题,从 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 ofNotFoundException
(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();
}
};
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/