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]
的方法声明是什么样子的。。。?