传递错误的媒体类型时无法捕获WebApplicationException

时间:2013-02-19 13:21:10

标签: java exception jersey

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

1 个答案:

答案 0 :(得分:1)

这看起来像是一个边界实现错误 - 但无论如何都可以争论。 specification的第3.7.2节对处理不支持的输入媒体类型有这样的说法:

  

支持请求实体主体的媒体类型(如果有)   输入数据格式(参见第3.5节)。如果没有方法支持媒体   一个实现必须生成一个请求实体主体的类型   WebApplicationException具有不受支持的媒体类型响应   (HTTP 415状态),没有实体。必须将异常处理为   在3.3.4节中描述了4。

所以问题是,如果不可解析的内容属于“不支持的输入数据格式”的保护范围。我猜泽西岛的实施团队决定不这样做。因此,他们正在向WebApplicationException 投放 一个实体正文,该正文由您的异常提供商拉链:

  

WebApplicationException的实例必须映射到响应为   如下。如果异常的响应属性不包含   实体和异常映射提供程序(参见第4.4节)是   可用于WebApplicationException的实现必须使用   provider创建一个新的Response实例,否则响应   财产直接使用

你无法解决这个问题,因为代码在泽西岛图书馆本身 - 你最希望做的就是在bug report中争论你的案例。