java – 为路由中的可选查询参数赋予null默认值 – Play Framework

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

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

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

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

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

type mismatch; found : Null(null) required: Long Note that implicit
conversions are not applicable because they are ambiguous: both method
Long2longNullConflict in class LowPriorityImplicits of type (x:
Null)Long and method Long2long in object Predef of type (x: Long)Long
are possible conversion functions from Null(null) to 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选项中包装id,因为这是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()) {...}
    ...
}
上一篇:Linux学习书目


下一篇:php – 通过访问路由名称参数自动执行Entrust权限并检查用户的权限