我正在尝试定义一个可选的查询参数,它将映射到一个 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)
您也可以尝试将 id
包装在 Scala Option
中,因为这是 Scala 中处理可选值的推荐方式。但是我认为 Play 不会将可选的 Scala Long 映射到可选的 Java Long(反之亦然)。你要么必须在你的 route 有一个 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()) {...}
...
}
关于java - 为路由中的可选查询参数分配空默认值 - Play Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22234140/