是否可以使用可变数量的URI参数配置JAX-RS方法?

时间:2010-09-02 16:40:03

标签: java web-services rest jersey jax-rs

是否可以配置GET方法来读取可变数量的URI参数并将它们解释为变量参数(数组)或集合?我知道查询参数可以作为列表/集读取,但在我的情况下我无法使用它们。

E.g:

@GET
@Produces("text/xml")
@Path("list/{taskId}")
public String getTaskCheckLists(@PathParam("taskId") int... taskId) {
    return Arrays.toString(taskId);
}

提前致谢

2 个答案:

答案 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 ...
}