【问题标题】:Can you have an optional QueryParam in jersey?你可以在球衣中有一个可选的 QueryParam 吗?
【发布时间】:2015-11-28 13:25:15
【问题描述】:

使用 java jersey,我的方法处理程序中有以下 @QueryParam:

@Path("/hello")
handleTestRequest(@QueryParam String name, @QueryParam Integer age)

我知道我是否这样做: http://myaddress/hello?name=something

它将进入那个方法......

我想这样做,以便我可以打电话:

http://myaddress/hello?name=something

它也将采用相同的方法。有什么方法可以标记“可选”PathParam?它也适用于@FormParam 吗?还是我需要创建一个具有不同方法签名的单独方法?

【问题讨论】:

    标签: java jersey


    【解决方案1】:

    您始终可以将返回类型包装在可选中,例如:@QueryParam("from") Optional<String> from

    【讨论】:

    • 这样的解决方案对我不起作用。结果中出现了 ModelValidationException
    • 这不是开箱即用的,你必须找到一些代码来支持Optionals:stackoverflow.com/a/65148523/5209935
    【解决方案2】:

    在 JAX-RS 中参数不是强制性的,因此如果您不提供年龄值,它将是 NULL,并且您的方法仍然会被调用。

    您还可以使用@DefaultValue 来提供默认年龄值(如果它不存在)。

    @PathParam 参数和其他基于参数的注释 @MatrixParam@HeaderParam@CookieParam@FormParam 遵循与 @QueryParam 相同的规则。

    Reference

    【讨论】:

    • 看起来球衣 2.23 默认返回 404,以防未传递 queryParameter。那么它不完全遵循规范吗?
    【解决方案3】:

    您应该可以在age 参数中添加@DefaultValue 注释,这样如果未提供age,将使用默认值。

    @Path("/hello")
    handleTestRequest(
        @QueryParam("name") String name,
        @DefaultValue("-1") @QueryParam("age") Integer age)
    

    根据Javadocs for @DefaultValue,它应该适用于所有*Param 注释。

    定义使用以下注释之一绑定的请求元数据的默认值:PathParam、QueryParam、MatrixParam、CookieParam、FormParam 或 HeaderParam。如果请求中不存在相应的元数据,则使用默认值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多