如何在泽西岛映射分号分隔的路径参数?

2022-09-04 01:25:26

有没有办法使用此参数样式:

/产品/123;456;789

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

我将 GET 方法声明为

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

更新:我指的是泽西岛1.1.5的泽西岛用户指南:

通常,方法参数的 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

更新:泽西岛1.3的更新日志包括以下信息:

已修复问题 540
http://java.net/jira/browse/JERSEY-540 参数化类型的 List/Set/SortedSet 支持参数化类型,例如 @QueryParam(“d”) List>(如果有已注册的 StringReaderProvider 支持 List 类型)。

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


答案 1

使用分号时,将创建矩阵参数。您可以使用或获取它们。例:@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&id=456&id=789

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

答案 2