在Jersey中处理多个查询参数

时间:2011-05-27 16:03:07

标签: java rest path jersey

在我正在处理的Web服务中,我需要实现一个带有/stats?store=A&store=B&item=C&item=D

查询参数的URI

为了将其分解,我需要能够使用查询参数来指定来自多个/所有商店的数据以及来自这些商店的多个/所有商品的数据。到目前为止,我已经能够实现一个查询参数,以便提取项目数据,但我已经迷失了如何实现更多的查询,并且似乎无法找到我之前看到的资源有了这个实现。

到目前为止,我的方法是按照

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

适用于一个项目,如果我没有在URI中键入参数,将返回所有数据。但是,我不确定如何处理比这更多的参数。

更新

我已经想出如何使用2个不同的参数,只需在方法中添加第二个参数,如下所示:

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

问题仍然是如何实现相同参数的多个值。

3 个答案:

答案 0 :(得分:74)

如果您将item方法参数的类型从String更改为List<String>等集合,则应该会获得一个包含您要查找的所有值的集合。 / p>

@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。

答案 1 :(得分:9)

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

其中ui被声明为其余资源中的成员,如下所示:

@Context UriInfo ui;

缺点是它根本没有出现在方法参数中。

答案 2 :(得分:2)

axios js等一些lib在发送多值param请求时使用方括号表示法:/ stats?store [] = A&amp; store [] = B&amp; item [] = C&amp; 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的参数。