【问题标题】:Is it possible to configure JAX-RS method with variable number of URI parameters?是否可以使用可变数量的 URI 参数配置 JAX-RS 方法?
【发布时间】:2010-09-02 16:40:02
【问题描述】:

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

例如:

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

提前致谢

【问题讨论】:

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


    【解决方案1】:

    如果我正确理解您的问题,@Path 注释可以采用正则表达式来指定路径组件列表。例如,类似:

    @GET
    @Path("/list/{taskid:.+}")
    public String getTaskCheckLists(@PathParam("taskid") List<PathSegment> taskIdList) {
        ......
    }
    

    有一个更广泛的例子here

    【讨论】:

    • 谢谢,这可能是我最接近的,所以现在我只需要放在那里匹配数字和斜杠的正则表达式,例如 example.com/ws/list/1 或 example.com/ ws/list/1/2/3/4/5/6
    【解决方案2】:

    我不会将此作为答案提交,因为它只是currently accepted answer 的一个边缘案例,这也是我也使用过的。 在我的情况下(泽西 1.19)/list/{taskid:.+} 不适用于零变量参数的边缘情况。将 RegEx 更改为 /list/{taskid:.*} 可以解决这个问题。另见this article(似乎适用)。

    此外,在将正则表达式更改为基数指示符为*(而不是+)后,我还必须以编程方式处理空字符串的情况,因为我会将List&lt;PathSegment&gt; 转换为List&lt;String&gt;(到将其传递到我的数据库访问代码中)。

    我从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 ...
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 2023-03-15
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多