如何在Jersey中映射以分号分隔的PathParams?

时间:2011-03-31 16:39:39

标签: java rest jersey jax-rs

有没有办法使用这个参数样式:

  

/产品/ 123; 456; 789

在泽西的JAX-RS中?如果我使用PathParam,则只返回列表中的第一个参数。我试图逃脱分号但是泽西只返回“123; 456; 789”作为第一个参数列表条目的值

我将GET方法声明为

public List<Product> getClichedMessage(@PathParam("ids") List<String> idList)

更新:我指的是泽西岛1.1.5的Jersey user guide

  

一般来说,该方法的Java类型   参数可以(...)4)是List,   Set或SortedSet,其中T   满足2或3以上。所结果的   集合是只读的。 (......)   有时参数可能包含更多   比同名的一个值。如果   这是4)中的类型可能的情况   用于获取所有值。

更新:这是我的测试代码:

package de.betabeans.resources;

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@Path("/test")
public class TestResource {

    @GET
    @Path("/{ids}")
    @Produces({"text/plain"})
    public String getClichedMessage(@PathParam("ids") List<String> idList) {
        return "size=" + idList.size();
    }

}

使用分号转义测试网址:http://localhost:8080/resources/test/1%3B2%3B3

更新:changelog for Jersey 1.3包含以下信息:

  

已解决问题540
  http://java.net/jira/browse/JERSEY-540   参数化类型   支持List / Set / SortedSet   参数,例如   @QueryParam(“d”)列表&gt;,   如果有StringReaderProvider   注册支持该类型   列表。

我将根据这篇文章http://comments.gmane.org/gmane.comp.java.jersey.user/7545

查看StringReaderProvider

1 个答案:

答案 0 :(得分:21)

使用分号时,您需要创建Matrix parameters。 您可以使用@MatrixParamPathSegment来获取它们。例如:

 public String get(@PathParam("param") PathSegment pathSegment)

请注意Matrix参数是遵循原始参数的参数。 因此,对于“123; 456; 789” - 123是路径参数,而456和789是矩阵参数的名称。

因此,如果您想通过ID获取产品,您可以执行以下操作:

public List<Product> getClichedMessage(@PathParam("ids") PathSegment pathSegment) {
    Set<String> ids = pathSegment.getMatrixParameters().keySet();
    // continue coding
}

请注意您的网址应为/products/ids;123;456;789

实际上,IMO并不是一个很好的设计:你使用矩阵参数名作为值。我认为使用查询参数更好:/products?id=123&id=456&id=789,因此您可以轻松地在方法中获取它们:

public List<Product> getClichedMessage(@QueryParam("id") List<String> ids)