web-dev-qa-db-ja.com

Jerseyでの複数のクエリパラメーターの処理

私が取り組んでいるWebサービスでは、/stats?store=A&store=B&item=C&item=DのようなクエリパラメータでURIを実装する必要があります

分解するには、クエリパラメータを使用して、複数/すべてのストアのデータと、それらのストアの複数/すべてのアイテムのデータを指定できる必要があります。これまでは、アイテムデータを取得するために1つのクエリ引数を適切に実装できましたが、クエリをさらに実装する方法については失われ、前に見たリソースを見つけることができませんこの実装で。

私の方法でこれまでのところ私が持っているのは

@GET
@Path("stats")
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "item") final String item)
{
    /**Run data using item as variable**/
    return someStringOfData
}

これは1つのアイテムに対してうまく機能し、URIにパラメーターを入力しなければすべてのデータを返します。ただし、これより多くのパラメーターを処理する方法はわかりません。

更新

メソッドに2番目の引数を追加するだけで、2つの異なるパラメーターを使用する方法がわかりました。

public String methodImCalling(@DefaultValue("All") @QueryParam(value = "store") final String store,
    @DefaultValue("All") @QueryParam(value = "item") final String item)

問題は、同じパラメーターの複数の値を実装する方法です。

38
ZKSteffel

itemメソッドパラメータのタイプをStringからList<String>などのコレクションに変更する場合、探しているすべての値を保持するコレクションを取得する必要があります。

@GET
@Path("/foo")
@Produces("text/plain")
public String methodImCalling(@DefaultValue("All") 
                              @QueryParam(value = "item") 
                              final List<String> item) {
   return "values are " + item;
}

JAX-RS仕様(セクション3.2)では、@QueryParamアノテーションに関して次のように記述されています。

次のタイプがサポートされています。
  1. プリミティブ型
  2. 単一のString引数を受け入れるコンストラクターを持つ型。
  3. 単一のvalueOf引数を持つStringという名前の静的メソッドを持つ型。
  4. List<T>Set<T>、またはSortedSet<T>ここで、Tは上記の2または3を満たします。
76
stand

List<String> items=ui.getQueryParameters().get("item");

uiは、次のようにrestリソースのメンバーとして宣言されます。

@Context UriInfo ui;

欠点は、メソッドの引数にまったく表示されないことです。

9
Tal

Axios jsのような一部のライブラリは、複数値のパラメーター要求を送信するときに角括弧表記を使用します。/ stats?store [] = A&store [] = B&item [] = C&item [] = D

すべてのケース(角括弧の有無にかかわらず)を処理するには、次のような別のパラメーターを追加できます。

public String methodImCalling(
  @QueryParam(value = "store") final List<String> store, 
  @QueryParam(value = "store[]") final List<String> storeWithBrackets, 
  @QueryParam(value = "item") final List<String> item,
  @QueryParam(value = "item[]") final List<String> itemWithBrackets) {
...
}

Nullをチェックする各引数を検査します。

2