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 で説明されているように、例外を処理する必要があります。

問題は、解析できないコンテンツが「サポートされていない入力データ形式」の傘下にあるかどうかです。ジャージーの実装チームは、そうしないと判断したと思います。WebApplicationException したがって、エンティティ本体を使用して をスローしています。これは、例外プロバイダーによって右に圧縮されます。

WebApplicationException のインスタンスは、次のように応答にマップする必要があります。例外の応答プロパティにエンティティが含まれておらず、例外マッピング プロバイダー (セクション 4.4 を参照) が WebApplicationException に使用できる場合、実装はプロバイダーを使用して新しい Response インスタンスを作成する必要があります。それ以外の場合は、応答プロパティが直接使用されます

コードは Jersey ライブラリ自体にあるため、これを回避することはできません。バグ レポートで自分の主張を主張することしかできません。

于 2013-02-19T13:43:53.677 に答える