为路由中的可选查询参数指定null默认值 – Play Framework

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

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

……我基本上想检查它是否传入:

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

但是,我收到了编译错误:

类型不匹配; found:Null(null)required:Long请注意,隐式转换不适用,因为它们不明确:类型为LowPriorityImplicits的类型为(x:Null)Long的方法和方法类型为(x:Long)Long的对象Predef中的Long2long方法可能的转换函数从Null(null)到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 Option包装id ,因为这是Scala中处理可选值的推荐方法。 但是我不认为Play会将可选的Scala Long映射到可选的Java Long(反之亦然)。 您要么必须在路线中使用Java类型:

 GET /foo controller.Foo.index(id: Option[java.lang.Long]) public static Result index(final Option id) { if (!id.isDefined()) {...} ... } 

或者Java代码中的Scala类型:

 GET /foo controller.Foo.index(id: Option[Long]) public static Result index(final Option id) { if (!id.isDefined()) {...} ... } 

在我的例子中,我使用String变量。

示例:

在我的路线:

GET /foo controller.Foo.index(id: String ?= "")

然后我用我的代码将解析器转换为Long – > Long.parseLong。

但我同意Hristo的方法是最好的。