Scala 从2.2到2.3的迁移播放:没有任何隐式视图可用
尝试将我的项目从play 2.2.7迁移到play 2.3.8 该项目具有以下代码: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
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。