Java 为route-Play框架中的可选查询参数指定空默认值

Java 为route-Play框架中的可选查询参数指定空默认值,java,routes,playframework-2.0,Java,Routes,Playframework 2.0,我试图定义一个可选的查询参数,该参数将映射到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注意隐式 转换不适用,因为

我试图定义一个可选的查询参数,该参数将映射到
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: (x:Long)Long类型的对象Predef中的Null)Long和方法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)
您还可以尝试将
id
包装到Scala
选项中,因为这是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()) {...}
    ...
}
GET/foo controller.foo.index(id:Option[java.lang.Long])
公共静态结果索引(最终选项id){
如果(!id.isDefined()){…}
...
}
或Java代码中的Scala类型:

GET  /foo  controller.Foo.index(id: Option[Long])

public static Result index(final Option<scala.Long> id) {
    if (!id.isDefined()) {...}
    ...
}
GET/foo controller.foo.index(id:Option[Long])
公共静态结果索引(最终选项id){
如果(!id.isDefined()){…}
...
}

在我的例子中,我使用字符串变量

例如:

按照我的路线:


GET/foo controller.foo.index(id:String?=“”)

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


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

hey@avik。。。这个
选项[Long]
的方法声明是什么样子的。。。?