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

时间:2014-03-06 19:30:26

标签: java routes playframework-2.0

我正在尝试定义一个可选的查询参数,该参数将映射到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可选查询参数的默认值?有什么方法可以做到这一点?

2 个答案:

答案 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的方法是最好的。