为路由中的可选查询参数指定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的方法是最好的。
- 制作java应用程序的“内存转储”?
- 如何创建一个在我的应用程序运行时一直运行的线程
- 为什么/如何得到错误:NoClassDefFoundError:org / springframework / aop / framework / ProxyFactory
- 在Java中匹配字符串中的单词
- Object.toString或Object.hashCode是否给出了对象的内存地址
- Java模型的JSON字段映射
- HTTPSURLconnection和Apache(系统)DefaultHttpClient之间的证书链不同
- Android:从网页获取HTML作为String,HttpClient无法正常工作
- 原始类型。 应参数化对generics类型的引用