如何在Jersey中映射以分号分隔的PathParams? [英] How can I map semicolon-separated PathParams in Jersey?

查看:218
本文介绍了如何在Jersey中映射以分号分隔的PathParams?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Is there a way to use this parameter style:


/ products / 123; 456; 789

/products/123;456;789

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

in JAX-RS with Jersey? If I use PathParam, only the first parameter in the list is returned. I tried to escape the semicolon but then Jersey returns only "123;456;789" as the value of the first parameter list entry

我将GET方法声明为

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

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

Update: I am referring to the Jersey user guide for Jersey 1.1.5:


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

In general the Java type of the method parameter may (...) 4) be List, Set or SortedSet, where T satisfies 2 or 3 above. The resulting collection is read-only. (...) Sometimes parameters may contain more than one value for the same name. If this is the case then types in 4) may be used to obtain all values.

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

Update: here is my test code:

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();
    }

}

使用分号转义测试网址:< a href =http:// localhost:8080 / resources / test / 1%3B2%3B3 =noreferrer> http:// localhost:8080 / resources / test / 1%3B2%3B3

Test URL with semicolon escaped: http://localhost:8080/resources/test/1%3B2%3B3

更新: Jersey 1.3的更新日志包括以下信息:


已修复问题540

http://java.net/jira/browse/JERSEY-540

List / Set / SortedSet的参数化类型支持
参数,例如
@QueryParam(d)List>,
如果有StringReaderProvider $ b注册的$ b支持
类型。

Fixed issue 540
http://java.net/jira/browse/JERSEY-540 Parameterized types of List/Set/SortedSet are supported for parameters, for example @QueryParam("d") List>, if there is a StringReaderProvider registered that supports the type List.

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

I'll check out StringReaderProvider based on this post http://comments.gmane.org/gmane.comp.java.jersey.user/7545

推荐答案

使用分号时,可以创建矩阵参数
您可以使用 @MatrixParam PathSegment 来获取它们。示例:

When you use semicolon, you create Matrix parameters. You can use either @MatrixParam or PathSegment to get them. Example:

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

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

Pay attention that Matrix parameters are these that follow the original parameter. So in case of "123;456;789" - 123 is path parameter, while 456 and 789 are the names of matrix parameters.

所以如果你想要通过ID获得产品,你可以这样做:

So if you want to get products by ids, you can do something like this:

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 ,因此您可以轻松地获取方法:

Actually, IMO it is not a very good design: you use matrix parameter name as a value. I think using query parameters is better: /products?id=123&id=456&id=789, so you can easily get them in method:

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

这篇关于如何在Jersey中映射以分号分隔的PathParams?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆