小编典典

为路由中的可选查询参数分配空默认值-Play框架

java

我正在尝试定义一个可选的查询参数,该参数将映射到Long,但当nullURL中不存在该参数时:

GET  /foo  controller.Foo.index(id: Long ?= null)

…并且我本质上想检查它是否传入:

public static Result index(Long id) {
    if (id == null) {...}
    ...
}

但是,出现编译错误:

类型不匹配;
找到:Null(null)必需:Long请注意,隐式转换不明确,因为它们是模棱两可的:类LowPriorityImplicits中类型为(x:Null)Long的方法Long2longNullConflict和对象类型为(x:Long)Long的对象中的方法Long2long都是从Null(null)到Long的可能转换函数

为什么不能这样做,将其分配null为期望的Long可选查询参数的默认值?有什么其他方法可以做到这一点?


阅读 225

收藏
2020-11-16

共1个答案

小编典典

请记住,您的路线中的可选查询参数的类型scala.Long不是java.lang.Long。Scala的Long类型等效于Java的原始类型long,并且不能为其分配值null

更改id为type java.lang.Long可以解决编译错误,这也许是解决问题的最简单方法:

GET  /foo  controller.Foo.index(id: java.lang.Long ?= null)

您还可以尝试将其包装id在Scala中Option,因为这是Scala中处理可选值的推荐方法。但是,我认为Play不会将可选的Scala
Long映射到可选的Java Long(反之亦然)。您必须在路由中使用Java类型:

GET  /foo  controller.Foo.index(id: Option[java.lang.Long])

public static Result index(final Option<Long> id) {
    if (!id.isDefined()) {...}
    ...
}

或在Java代码中输入Scala:

GET  /foo  controller.Foo.index(id: Option[Long])

public static Result index(final Option<scala.Long> id) {
    if (!id.isDefined()) {...}
    ...
}
2020-11-16