我正在尝试定义一个可选的查询参数,该参数将映射到Long,但当nullURL中不存在该参数时:
Long
null
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可选查询参数的默认值?有什么其他方法可以做到这一点?
请记住,您的路线中的可选查询参数的类型scala.Long不是java.lang.Long。Scala的Long类型等效于Java的原始类型long,并且不能为其分配值null。
scala.Long
java.lang.Long
long
更改id为type java.lang.Long可以解决编译错误,这也许是解决问题的最简单方法:
id
GET /foo controller.Foo.index(id: java.lang.Long ?= null)
您还可以尝试将其包装id在Scala中Option,因为这是Scala中处理可选值的推荐方法。但是,我认为Play不会将可选的Scala Long映射到可选的Java Long(反之亦然)。您必须在路由中使用Java类型:
Option
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()) {...} ... }