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(...)
。