我希望捕获所有类型的Throwable
,以便在出现异常时客户端不会暴露给我们的内部堆栈跟踪。
我正在使用ExceptionMapper<Throwable>
,如下所示:
@Provider
public class MappableContainerExceptionMapper implements ExceptionMapper<Throwable>
{
@Override
public Response toResponse(Throwable exception)
{
return Response.status(Response.Status.BAD_REQUEST).entity("caught").build();
}
}
但是,在传递Content-Type=asdfasdf
时,我会向客户端显示以下堆栈跟踪:
javax.ws.rs.WebApplicationException: java.lang.IllegalArgumentException: Error parsing media type 'sdfsdfdvfv'
com.sun.jersey.server.impl.model.HttpHelper.clientError(HttpHelper.java:265)
com.sun.jersey.server.impl.model.HttpHelper.getContentType(HttpHelper.java:91)
com.sun.jersey.server.impl.model.HttpHelper.getContentType(HttpHelper.java:77)
com.sun.jersey.spi.container.ContainerRequest.getMediaType(ContainerRequest.java:651)
com.sun.jersey.spi.container.servlet.WebComponent.filterFormParameters(WebComponent.java:832)
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:407)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
</pre></p><p><b>root cause</b> <pre>java.lang.IllegalArgumentException: Error parsing media type 'sdfsdfdvfv'
com.sun.jersey.core.impl.provider.header.MediaTypeProvider.fromString(MediaTypeProvider.java:79)
com.sun.jersey.core.impl.provider.header.MediaTypeProvider.fromString(MediaTypeProvider.java:53)
javax.ws.rs.core.MediaType.valueOf(MediaType.java:119)
com.sun.jersey.server.impl.model.HttpHelper.getContentType(HttpHelper.java:89)
com.sun.jersey.server.impl.model.HttpHelper.getContentType(HttpHelper.java:77)
com.sun.jersey.spi.container.ContainerRequest.getMediaType(ContainerRequest.java:651)
我想要抓住这个,以便客户端显示为JSON。
答案 0 :(得分:1)
这看起来像是一个边界实现错误 - 但无论如何都可以争论。 specification的第3.7.2节对处理不支持的输入媒体类型有这样的说法:
支持请求实体主体的媒体类型(如果有) 输入数据格式(参见第3.5节)。如果没有方法支持媒体 一个实现必须生成一个请求实体主体的类型 WebApplicationException具有不受支持的媒体类型响应 (HTTP 415状态),没有实体。必须将异常处理为 在3.3.4节中描述了4。
所以问题是,如果不可解析的内容属于“不支持的输入数据格式”的保护范围。我猜泽西岛的实施团队决定不这样做。因此,他们正在向WebApplicationException
投放 一个实体正文,该正文由您的异常提供商拉链:
WebApplicationException的实例必须映射到响应为 如下。如果异常的响应属性不包含 实体和异常映射提供程序(参见第4.4节)是 可用于WebApplicationException的实现必须使用 provider创建一个新的Response实例,否则响应 财产直接使用。
你无法解决这个问题,因为代码在泽西岛图书馆本身 - 你最希望做的就是在bug report中争论你的案例。