0

我想捕获所有类型的,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。

4

1 回答 1

1

这看起来像是一个边界实现错误——但无论哪种方式都可以争论。规范的第 3.7.2 节对不支持的输入媒体类型的处理有这样的说法:

请求实体主体的媒体类型(如果有)是支持的输入数据格式(参见第 3.5 节)。如果没有方法支持请求实体主体的媒体类型,则实现必须生成带有不受支持的媒体类型响应(HTTP 415 状态)且没有实体的 WebApplicationException。必须按照 3.3.4 节中的 4 所述处理异常。

所以问题是,如果无法解析的内容属于“不支持的输入数据格式”的范畴。我猜泽西岛的实施团队决定不这样做。所以他们抛出了WebApplicationException 一个实体主体,它由您的异常提供者直接压缩:

WebApplicationException 的实例必须按如下方式映射到响应。如果异常的响应属性不包含实体并且异常映射提供程序(参见第 4.4 节)可用于 WebApplicationException,则实现必须使用提供程序来创建新的响应实例,否则直接使用响应属性

你无法解决这个问题,因为代码在 Jersey 库本身中——你最希望做的就是在错误报告中争论你的情况。

于 2013-02-19T13:43:53.677 回答