@QueryParam如何将没有值的参数转换为boolean" false"?

时间:2015-10-21 11:31:05

标签: java jax-rs

我想使用像http://www.example.com/rest/foo?bar这样的网址,其中bar查询参数没有值,只有它的存在才能表示变量是true还是{{1 }}。

目前,缺失值假定为false(空)并传递给"",将其视为new Boolean()

是否有更优雅的方式来定义它,而不是将参数声明为String并自行转换?

例如一个班级false或类似的?

3 个答案:

答案 0 :(得分:9)

我知道这是一个老问题,但我遇到了同样的麻烦。

为了解决我的问题,我使用了Annotation @DefaultValue:

@GET
@Path("/path")
public Response myMethod(@DefaultValue("true") @QueryParam("foo") boolean foo) {
    if (foo) {
       ...
    }
}

因此,当请求包含参数foo时,布尔值将为false,否则将为true。它显示了与现实相反的情况,但如果你意识到它,它的使用起来非常简单。

答案 1 :(得分:8)

注意:看到Phoste's answer后,我会选择他/她的解决方案。我将这个答案留下来,因为这里仍然有一些有用的信息。

  

是否有更优雅的方式来定义它,而不是将参数声明为String并自行转换?像例如一个班级javax.rs.BooleanFlag或类似的?

没有此类型(BooleanFlag),如果查看javadoc for @QueryParam,您会看到一个选项列表,说明我们如何创建自定义类型以使用@QueryParam值(在大多数情况下,同样适用于其他@XxxParam

  
      
  • 拥有一个接受单个String参数的构造函数
  •   
  • 拥有名为staticvalueOf的{​​{1}}方法,该方法接受单个String参数(例如,请参阅fromString
  •   
  • 拥有Integer.valueOf(String) JAX-RS扩展SPI的注册实现,返回ParamConverterProvider实例,该实例能够为该类型进行“from string”转换。
  •   

所以从第一个选项开始,理论上你应该能够做类似

的事情
ParamConverter
public class Flag {

    private final boolean  isPresent;
    public Flag(String param) { isPresent = param != null; }
    public boolean isPresent() { return isPresent; }
}

现在,当查询标志存在时,此方法有效。但是当它不是时,它就像任何其他非原始类型一样;它是空的。所以对@GET public String get(@QueryParam("bar") Flag bar) { if (bar.isPresent()) { return "bar is present"; } else { return "bar is not present"; } } 的调用给出了一个NPE。使用bar.isPresentfromString进行测试,结果相同。我们可以检查valueOf,但仅仅使用String并检查String是否为null并不是更好。它不是漂亮

所以最后一个选项是if (bar == null)。哪个确实有效。以下是实施。

ParamConverterProvider

确保提供商已注册。在我看来,这是一个非常干净的解决方案。

答案 2 :(得分:5)

您可以尝试以下方法:

@GET
@Path("/some-path")
public Response myMethod(@Context HttpServletRequest request) {

    boolean isParameterPresent = request.getParameterMap().contains("bar");

    ...
}

peeskillet's answer中显示的解决方案是实现它的最聪明方法。