1

私のサービス:

@POST
public String setData(@QueryParam("id") Long is, MyObject payload) {
...
}

or

@POST
public String setData(@PathParam("id") Long is, MyObject payload) {
...
}

サーバー上の私のインターセプター:

Object read(MessageBodyReaderContext context) throws IOException, WebApplicationException {

Class mypayloadtype = context.getType;

InputStream mypayloadinpustream = context.getInputStream();


Long myidparam = ???????? // how to get the query or path param here?

}

編集:もう少し具体的にするには:

私がやりたいのは、XML を取得し、パラメーターに基づいて別の監査システムに保存することです。多分 PreProcessInterceptor / PostProcessInterceptor がより良い選択でしょうか?

xmlがまだ前処理に利用できる場合にパラメータを取得するためのヒントや代替方法はありますか?

ミゲル

4

2 に答える 2

1

今日、同じ問題に遭遇しました。@PathParamメソッドにs と@QueryParams が必要で、最終的には次のread()ようになりました。

public class MyInterceptor implements PreProcessInterceptor, MessageBodyReaderInterceptor
{
    private static ThreadLocal<UriInfo> uri = new ThreadLocal<UriInfo>();

    public ServerResponse preProcess(HttpRequest request, ResourceMethod method)
    {
         uri.set(request.getUri);
         ...
    }

    public Object read(MessageBodyReaderContext context)
    {
        String param = uri.get().getPathParameters().getFirst("myidparam");
        ...
    }
}

今考えてみると、よくわかりませんが、PreProcessInterceptor/PostProcessInterceptorを使用するだけで、私の問題 (そしておそらくあなたの問題) のトリックも実行できるかどうかはわかりません。明日また見てみます。

于 2013-02-21T20:52:00.307 に答える
0

私はこのトピックの専門家ではありMessageBodyReaderContextませんが、インターフェイスがサーバー側にあるのかクライアント側にあるのかを実際には認識していないように見えるため、リクエストやそのパラメータ/パス部分などを公開できません。

私の知る限り、これは不可能です。

コードが残りの通信のサーバー側にあることがわかっている場合は、サーブレットフィルターを使用してリクエストをThreadLocalに格納し、リクエストの処理中にそこからアクセスできます。これは、SpringフレームワークRequestContextFilterと同様です。 RequestContextHolder?(その場合、リクエストオブジェクトはサービスのアノテーションについて何も知りませんが、代わりにリクエストから手動で情報を抽出する必要があります。これは、2つの場所に同じ情報があることを意味するため、より良い解決策が必要です。 。)

編集MessageBodyReaderInterceptor:いくつかの例を見た後、入力ストリームを読み取ってオブジェクトを作成し、それにパスパラメータを追加したい場合は、単に行く方法ではないという漠然とした感じがします。代わりに、リクエスト本文データからオブジェクトを構築するを設定します。このメソッドに、のアノテーションと一致するアノテーションが付けられていると仮定すると、MessageBodyReaderこれはに渡されます。そこで、リクエスト本文から読み取ったオブジェクトに欠落しているIDを設定できる場合があります。これに関連するいくつかの例はここにあるようです:Jerseyを使用して完全なRESTリクエスト本文を取得するにはどうすればよいですか?(ただし、jBossではなくJerseyの場合:-/)public String setData(@PathParam("id") Long is, MyObject payload)@Consumes@ConsumeMimeMessageBodyReadersetData

しかし、それがあなたに役立つかどうかはわかりません。また、この質問に適切に答える能力を完全に過大評価していると感じているので、より知識のある人がより良い解決策を見つけてくれることを願っています。

于 2013-02-13T18:12:29.023 に答える