我正在尝试定义一个可选的查询参数,该参数将映射到Long,但在URL中不存在时将为null:
GET /foo controller.Foo.index(id: Long ?= null)
……我基本上想检查它是否传入:
public static Result index(Long id) {
if (id == null) {...}
...
}
但是,我收到了编译错误:
type mismatch; found : Null(null) required: Long Note that implicit
conversions are not applicable because they are ambiguous: both method
Long2longNullConflict in class LowPriorityImplicits of type (x:
Null)Long and method Long2long in object Predef of type (x: Long)Long
are possible conversion functions from Null(null) to Long
为什么我不能这样做,将null指定为预期的Long可选查询参数的默认值?有什么方法可以做到这一点?
解决方法:
请记住,路由中的可选查询参数的类型为scala.Long,而不是java.lang.Long. Scala的Long类型相当于Java的原始long,并且不能赋值null.
将id更改为java.lang.Long类型应修复编译错误,这可能是解决问题的最简单方法:
GET /foo controller.Foo.index(id: java.lang.Long ?= null)
您还可以尝试在Scala选项中包装id,因为这是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()) {...}
...
}