3

私は最近、Jersey JAX-RS Rest サービスを実装しました。XML 型と Java 型の間でアンマーシャリングとマーシャリングを行うことができる JIBX プロバイダーを作成しました。URL パスでバージョンを指定して、サービスのバージョンも変更したいと考えています。バージョニングには、Java 型のマーシャリングおよびアンマーシャリングに使用されるメッセージ バインディングのバージョンが含まれます。

したがって、バージョンをカスタム JIBX プロバイダーに渡す必要があり、そのバージョンを含む URL パスが必要です。ただし、プロバイダ インターフェイス (MessageBodyWriterおよびMessageBodyReader) は、インターフェイス メソッドで URI パスを提供しません。

以下は、インターフェイスのwriteTo()メソッドのメソッド シグネチャです。MessageBodyWriter

writeTo(Object, Type, Annotation[], MediaType, MultivaluedMap, OutputStream)

このメソッド パラメーターにはパス uri が含まれていないため、カスタム jibx プロバイダーは、Java 型をマーシャリングするために使用する必要があるメッセージ バインディング バージョンを認識できません。これを回避する方法はありますか?

4

2 に答える 2

9

HttpServletRequestよりもJAX-RS固有のものが必要な場合は、javax.ws.rs.core.UriInfoを挿入できます。

public class MyProvider implements MessageBodyWriter {
    @javax.ws.rs.core.Context
    javax.ws.rs.core.UriInfo uriInfo;
}

@javax.ws.rs.PathParamを使用してパスパラメーターをキャプチャしていると想定しています。その後、UriInfo.getPathParameters()を使用できる可能性があります。UriInfo.getPathSegments()にフォールバックして、探している情報を取得することもできます。これにより、リクエストURIを自分で解析する手間が省けます。すべてのJAX-RS実装がこれを実行できるはずです。

于 2010-07-22T22:39:11.943 に答える
1

@Contextプロバイダーのフィールドに注釈を定義することにより、プロバイダーから URI パスにアクセスできます。

例えば、

public class CustomProvider implements MessageBodyWriter
{

    @Context HttpServletRequest request;

    ....
}

このフィールドは、リクエストごとに自動的に設定されます。リクエストがフィールドとして設定されていても、実際のリクエストはプロキシを使用しており、スレッドに属するリクエストを決定するためにスレッド ローカルである可能性が高いため、値はスレッドセーフです。

于 2010-07-13T21:26:54.377 に答える