17

同じ GET パスに対して複数の関数を使用したいと考えています。

同様に、クエリ パラメータが URL 文字列のパラメータと一致する場合にのみ、Web サービスがこれらの関数を「検索」するようにしたいと考えています。

例えば:

私が持っていますPath("/myGET")

そして、そのパスには2つの機能が必要です:

@GET  
@Produces(MediaType.APPLICATION_JSON)
@TypeHint(TagSets.class)
public Response getTagSets(@QueryParam("entityId") Integer entityId)
{
    ...
}

@GET  
@Produces(MediaType.APPLICATION_JSON)
@TypeHint(TagSets.class)
public Response getTagSets(){
    ...
}

現在、エラーが発生しています:

SEVERE: 次のエラーと警告がリソース クラスまたはプロバイダー クラスで検出されました: SEVERE: メディア タイプの競合が発生しています。リソース メソッド public javax.ws.rs.core.Response<...>.getTagSets(java.lang.Integer) および public javax.ws.rs.core.Response<...>.getTagSets(java.lang. Integer,java.lang.Integer) は、同じメディア タイプを生成できます。重大: メディア タイプの競合を生成しています。リソース メソッド public javax.ws.rs.core.Response<...>.getTagSets() および public javax.ws.rs.core.Response <...>.getTagSets(java.lang.Integer,java.lang .Integer) は同じメディア タイプを生成できます

最初に:私がここでやりたいことを達成する方法はありますか..

2番目:これが利用可能な場合、クエリパラメーターが関数で要求されたものと正確に一致する場合にのみ、パスが見つかる方法はありますか? たとえば、同じパスが呼び出された@QueryParam("differentParam")場合、2 つの関数のいずれにも到達しません。

3番目: Jerseyでこれを行う方法がない場合、他のフレームワークで行う方法はありますか?.

重要: 質問に答える人々は、解決策ではなく回避策を探していると考えています。今日、私は1つの関数を使用し、パラメーターをチェックして、これから必要なものを呼び出しています(これは、質問を投稿する前に使用したものです)。しかし、私が探しているのは、おそらくフレームワークの力を使って問題を解決することです

ありがとう。

4

2 に答える 2

5

リソースは、そのパラメーターではなく、そのパスによって一意に定義されます。定義した 2 つのリソースのパスが同じです。、、のよう/myGet/entityに、/myGet/それぞれに新しいパスを定義できます/myGet/differentParam。または単一のパスを使用して、/myGet/次のようにクエリ パラメータを確認します。

@GET  
@Produces(MediaType.APPLICATION_JSON)
@TypeHint(TagSets.class)
public Response getTagSets(@Context HttpServletRequest request){

       ...

       if (request.getParameterMap().isEmpty()) {
           // then you have no query params, implement as there are no query params
       } else {
           String queryParam = request.getQueryString();
           // check queryParam, and add another if else statements, implement
       }

       ...

}
于 2013-08-27T13:53:44.360 に答える
1

唯一の方法は、コメントに記載されているとおりです。すべてのクエリ パラメータを宣言し、値 (存在するかどうか) に基づいて正しいメソッドを呼び出す単一のメソッドを使用できます。

(回避策) 複数のクエリ パラメータを持つ単一のエンドポイントをクライアントに公開するだけで、コードの実装が重要でない場合は、インターセプターを使用できます。クエリ パラメータを読み取り、URI を変更して適切なメソッドに誘導します。

于 2013-08-27T13:15:55.277 に答える