迁移到 anorm2.4(使用 play 2.4):ToStatement[T] 和 ToStatement[Option[T]]

Posted

技术标签:

【中文标题】迁移到 anorm2.4(使用 play 2.4):ToStatement[T] 和 ToStatement[Option[T]]【英文标题】:Migrating to anorm2.4 (with play 2.4): ToStatement[T] and ToStatement[Option[T]] 【发布时间】:2015-11-19 17:00:21 【问题描述】:

直到 play 2.3 包含的异常,我可以写以下内容:

implicit val arbitraryClassToStatement = new ToStatement[ArbitraryClass] 
  def set( 
    s: java.sql.PreparedStatement, 
    index: Int, 
    aValue: ArbitraryClass
  )
  : Unit = 
    s.setString(
      index, 
      ArbitraryClass.definingString
    )
  

这将有助于插入

SQL("INSERT INTO SomeTable Values( nonNullAc, possiblyNullAc )" ).on(
 'nonNullAc -> ArbitraryClass( "abcd" ),
 'possiblyNullAc -> Option( ArbitraryClass( "abcd" ) )
)

意味着 ArbitraryClass 和 Option[ ArbitraryClass ] 都会被它满足。这似乎不再是这种情况,因为我收到以下错误:

[error]  found   : (Symbol, Option[models.Misc.Url])
[error]     (which expands to)  (Symbol, Option[java.net.URL])
[error]  required: anorm.NamedParameter

有人可以指点我处理这个问题的正确方法吗?我想要最少的代码重复..

【问题讨论】:

【参考方案1】:

您需要创建一个ParameterMetaData[ArbitraryClass] 才能工作

implicit object ArbitraryClassMetaData extends ParameterMetaData[ArbitraryClass] 
  val sqlType = ParameterMetaData.StringParameterMetaData.sqlType
  val jdbcType = ParameterMetaData.StringParameterMetaData.jdbcType 

这里我只是重新取了ParameterMetaData[String]的值

【讨论】:

这看起来很有帮助。除了 API 参考之外,还有详细的文档吗? 不幸的是不是真的,只有你放在上面的链接 不幸的是,在这种情况下,Scalac 不支持@implicitNotFound,这将更准确地表明根本原因。

以上是关于迁移到 anorm2.4(使用 play 2.4):ToStatement[T] 和 ToStatement[Option[T]]的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework 2.4 全局对象迁移

Play 2.4 添加模块而不是插件

如何在 play 2.4 中使用 CommonsMailerPlugin

Play 2.4 中的 Global.getControllerInstance 等价物是啥?

在启动时向 Play 2.4 中的演员注入服务

Play 2.4 / Ebean / JPA / hibernate-entitymanager 的正确配置是啥?