每个标题,从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
答案 0 :(得分:2)
从阅读this看来,JAX-RS规范说实现者应该在NotFoundException
和@QueryParam
的{{1}}(404)中包含未处理的异常,以及我为@PathParam
测试了400,(我猜测BadRequestException
)。
&#34;如果字段或属性使用
@FormParam
,@MatrixParam
或@QueryParam
进行注释,则实现必须生成一个实例@PathParam
(404状态)包装抛出的异常而没有实体&#34;
我可以看到处理异常的几种方法是
只需在NotFoundException
处理,例如
ParamConverter
或者只是将您的例外扩展为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