2

MessageBodyReader処理中にリクエスト URI に対して URI を解決する必要があるカスタムを実装しています。MessageBodyReaderが JAX-RSサーバー実装で使用されている場合。UriInfo着信 POST リクエストを処理します。実行時に挿入されるオブジェクトからリクエスト URI を取得できます@Context(たとえばhttps://stackoverflow.com/a/3314076で説明されているように):

public class MyProvider implements MessageBodyReader {

  @javax.ws.rs.core.Context
  javax.ws.rs.core.UriInfo uriInfo;

  @Override
  public Iterable<URI> readFrom(Class<Iterable<URI>> clazz, Type genericType,
      Annotation annotations[], MediaType mediaType,
      MultivaluedMap httpHeaders, InputStream entityStream)
        throws IOException, WebApplicationException {

    URI requestURI = uriinfo.getAbsolutePath(); // NPE if called in a client

    // Parsing entityStream resolving relative URIs using requestURI

  }
}

MessageBodyReaderのエンティティの読み取り中にが JAX-RSクライアント実装で呼び出された場合Response、インジェクションは発生しませんNullPointerException

Iterable<URI> it = ClientBuilder.newClient().target("http://example.org/").request().get()
    .readEntity(new GenericType<Iterable<URI>>(){});

URIを解決する目的で、私の質問は次のとおりです。

が JAX-RSクライアント実装で呼び出されreadFrom(...)た場合、リクエスト URI を見つけるにはどうすればよいですか?MessageBodyReader

現在の回避策: Jersey ドキュメントの10.4 章「フィルターとインターセプターの実行順序」を読んだ後、ステップ 16 でClientResponseFilter、要求 URI と応答ヘッダーの両方にアクセスできることがわかりました。したがってClientResponseFilter、リクエスト URI をカスタム レスポンス ヘッダーに入れる を作成しました。次に、そのカスタム ヘッダーを の 5 番目のパラメーターから取得できますreadFrom(...)

4

0 に答える 0