是否可以配置GET方法来读取可变数量的URI参数并将它们解释为变量参数(数组)或集合?我知道查询参数可以作为列表/集读取,但在我的情况下我无法使用它们。
E.g:
@GET
@Produces("text/xml")
@Path("list/{taskId}")
public String getTaskCheckLists(@PathParam("taskId") int... taskId) {
return Arrays.toString(taskId);
}
提前致谢
答案 0 :(得分:9)
如果我正确理解了您的问题,@Path
注释可以采用正则表达式来指定路径组件列表。例如,像:
@GET
@Path("/list/{taskid:.+}")
public String getTaskCheckLists(@PathParam("taskid") List<PathSegment> taskIdList) {
......
}
有一个更广泛的例子here。
答案 1 :(得分:3)
我不是将此作为答案提交,因为它仅仅是currently accepted answer的一个边缘案例,这也是我所使用的。
在我的情况下(Jersey 1.19)/list/{taskid:.+}
不适用于零变量参数的边缘情况。将RegEx更改为/list/{taskid:.*}
可以解决这个问题。另见this article(似乎适用)。
此外,在将正则表达式更改为基数指示符为*
(而不是+
)时,我还必须以编程方式处理空字符串的情况,因为我会将List<PathSegment>
转换为a List<String>
(将其传递给我的数据库访问代码)。
我从PathSegment
转换为String
的原因是我不希望javax.ws.rs.core
包中的类污染我的数据访问层代码。
这是一个完整的例子:
@Path("/listDirs/{dirs:.*}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response listDirs(@PathParam("dirs") List<PathSegment> pathSegments) {
List<String> dirs = new ArrayList<>();
for (PathSegment pathSegment: pathSegments) {
String path = pathSegment.getPath();
if ((path!=null) && (!path.trim().equals("")))
dirs.add(pathSegment.getPath());
}
List<String> valueFromDB = db.doSomeQuery(dirs);
// construct JSON response object ...
}