Scala 从2.2到2.3的迁移播放:没有任何隐式视图可用

Scala 从2.2到2.3的迁移播放:没有任何隐式视图可用,scala,playframework,playframework-2.2,playframework-2.3,anorm,Scala,Playframework,Playframework 2.2,Playframework 2.3,Anorm,尝试将我的项目从play 2.2.7迁移到play 2.3.8 该项目具有以下代码: def setCoordinatesOfAddresses(cardId: Long, caller: Option[Tuple2[Float,Float]] = None, event: Option[Tuple2[Float,Float]] = None) { Logger.debug("callling SC.setCoordinatesOfAddresses") DB.withConnectio

尝试将我的项目从play 2.2.7迁移到play 2.3.8

该项目具有以下代码:

def setCoordinatesOfAddresses(cardId: Long, caller: Option[Tuple2[Float,Float]] = None, event: Option[Tuple2[Float,Float]] = None) {
  Logger.debug("callling SC.setCoordinatesOfAddresses")
  DB.withConnection { implicit c =>
    try {
      val query = SQL("Execute Sc.setCoordinatesOfAddresses {cardId}, {deviceLatitude}, {deviceLongitude}, NULL, NULL, {eventsLatitude}, {eventsLongitude}")
      query.on(
        "cardId" -> cardId,
        "deviceLatitude" -> caller.map(_._1).getOrElse(null),
        "deviceLongitude" -> caller.map(_._2).getOrElse(null),
        "eventsLatitude" -> event.map(_._1).getOrElse(null),
        "eventsLongitude" -> event.map(_._2).getOrElse(null) ).execute()
    } catch {
      case e: Throwable => Logger.error("error", e)
    }
  }
  Logger.debug("SC.setCoordinatesOfAddresses called")
}
编译器给了我这个错误:

Error:(384, 28) Play 2 Compiler: 
  ../app/controllers/Cards.scala:384: No implicit view available from Any => anorm.ParameterValue.
       "deviceLatitude" -> caller.map(_._1).getOrElse(null),
                     ^
我该怎么解决这个问题? 正如我从文档中了解到的,我需要定义参数类型。但在下面的代码中,我无法理解在何处以及如何做到这一点。

试试看

val ps = Seq[anorm.ParameterValue](yourParameter1,yourParameter2) // Seq[ParameterValue]
SQL("SELECT * FROM test WHERE a={a} b={b}").
  on('a -> ps(0), 'b -> ps(1))
您正在使用
Any
(或其他)类型的参数,但文档要求使用
anorm.ParameterValue
类型


我建议首先尝试
val p:ParameterValue=caller

我认为问题更多的是,Tuple2[Float,Float](顺便说一下
(Float,Float)
)没有具体的参数转换

在Anorm 2.3之前,不安全的转换是使用
.toString
(这可能会导致很多问题)

更好的方法是在将元组作为参数传递之前或通过添加自定义参数转换,将元组转换为格式化字符串

(Anorm doc指出类型安全问题,以及如何实现转换)

getOrElse(null)导致了您的问题。这是因为您正在使用
选项[Float]
调用
getOrElse
。但是,Scala中的
null
不能分配给像
Float
这样的值类型。从:

Null是所有引用类型的子类型;它的唯一实例是空引用。由于Null不是值类型的子类型,因此Null不是任何此类类型的成员例如,不可能为scala.Int类型的变量赋值null

相同的语句适用于
浮点
。由于
null
Float
没有通用的超类型(除了
Any
),Scala将
调用者.map(u.\u 1).getOrElse(null)
推断为
Any
。这在Play 2.2.x中是允许的,但是在2.3.x中,
Any
不再允许作为参数传递,因为它不是类型安全的


解决方案是什么?只需删除
getOrElse(null)
s,就可以开始了
caller.map(u._1)
是一个
选项[Float]
,Anorm知道如何处理它是否为空。一般来说,在Scala中使用
null
是不好的做法。如果您看到自己正在调用
getOrElse(null)
,您应该问问自己是否有更好的安全处理方法。

您尝试过这些答案吗?我遇到了这个问题,原因是我使用的是java 1.7,而不是最新(2.4)版本使用的java 1.8。