【问题标题】:How can I map semicolon-separated PathParams in Jersey?如何在泽西岛映射分号分隔的 PathParams?
【发布时间】:2011-03-31 16:39:38
【问题描述】:

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

/products/123;456;789

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

我将 GET 方法声明为

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

更新:我指的是 Jersey 1.1.5 的 Jersey user guide

一般来说方法的Java类型 参数可能 (...) 4) 是列表, 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();
    }

}

用分号转义的测试 URL: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") 列表>, 如果有 StringReaderProvider 注册支持该类型 列表。

我会根据这篇帖子http://comments.gmane.org/gmane.comp.java.jersey.user/7545查看StringReaderProvider

【问题讨论】:

  • 关于第二次更新:抱歉,这样你是不会成功的。您继续使用矩阵参数,而您认为分号是路径参数的分隔符。它不是。它不会成为一个。它是矩阵参数的分隔符,用于创建像 /moremaps.com/map/color;lat=50;long=20;scale=32000 这样的 url

标签: java rest jersey jax-rs


【解决方案1】:

当你使用分号时,你创建了Matrix parameters。 您可以使用@MatrixParamPathSegment 来获取它们。示例:

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

注意矩阵参数是跟在原始参数后面的。 所以在 "123;456;789" 的情况下 - 123 是路径参数,而 456 和 789 是矩阵参数的名称。

所以如果你想通过 ids 获取产品,你可以这样做:

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&amp;id=456&amp;id=789,因此您可以轻松地在方法中获取它们:

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

【讨论】:

  • 感谢您的建议!请参阅我的更新,在文档中似乎 PathParam 实际上也支持多个值。
  • 嗯,部分正确。你可以写类似@Path("/url/{param}/and/{param}) 这样@PathParam 将被复制,它可以作为一个列表接收。但我不认为它是你想要的。跨度>
  • 是的,这是可行的,但是 URL 中的参数数量必须与模式中的数量完全匹配。我的解决方法是使用 String 而不是 List 并在代码中进行解析 (String.split(ids))。
  • 嗯,很明显,您的解决方法会奏效。你得到整个路径段并自己解析它。这样你就可以使用任何东西作为分隔符,它会起作用。请注意它不是非常 RESTful,因为您使用预定义约定的方式与您应该使用它们的方式有点不同。
  • 好的,那我去看看 /products?id=123&id=456&id=789 样式(不知道参数会出现多次)。实际上在 Stackoverflow API 中使用了分号分隔的参数(参见api.stackoverflow.com/1.1/usage/methods/users-by-ids
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2011-08-02
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多