我正在尝试定义一个可选的查询参数,该参数将映射到Long
,但在网址中不存在时将为null
:
GET /foo controller.Foo.index(id: Long ?= null)
...我基本上想检查它是否传入:
public static Result index(Long id) {
if (id == null) {...}
...
}
但是,我收到了编译错误:
类型不匹配; found:Null(null)required:Long注意隐式 转换不适用,因为它们含糊不清:两种方法 类型为LowPriorityImplicits的Long2longNullConflict(x: Null)Long和方法Long2long在对象Predef中的类型(x:Long)Long 可能的转换函数从Null(null)到Long
为什么我不能这样做,将null
指定为预期Long
可选查询参数的默认值?有什么方法可以做到这一点?
答案 0 :(得分:25)
请注意,路线中的可选查询参数的类型为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
中包装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()) {...}
...
}
答案 1 :(得分:1)
在我的情况下,我使用String变量。
示例:
在我的路线中:
GET /foo controller.Foo.index(id: String ?= "")
然后我用我的代码将解析器转换为Long - &gt;的Long.parseLong。
但我同意Hristo的方法是最好的。