我正在尝试为新的Slick 3项目构建自定义数据库列转换器。使用MappedColumnType很容易制作这些,但你必须导入驱动程序api。对于单个DAO类中的一次性类型,这是直截了当的。但我想在所有DAO对象中使用我的自定义列类型。我无法以编译器可以识别隐含的方式构造我的导入。
以下是我想要构建的库类型的示例。它有一个转换器,非常类似于在许多Slick 2示例中看到的无处不在的Joda日期转换器。
package dao
import java.sql.Date
import data.Timestamp
import play.api.db.slick.{DatabaseConfigProvider, HasDatabaseConfigProvider}
import slick.driver.JdbcProfile
case class StandardConversions(protected val dbConfigProvider: DatabaseConfigProvider)
extends HasDatabaseConfigProvider[JdbcProfile] {
import driver.api._
implicit val timestampColumnType = MappedColumnType.base[Timestamp, Date](
{ data => new Date(data.value) },
{ sql => Timestamp(sql.getTime) }
)
}
在DAO课程中,我尝试像这样进行导入:
val conversions = StandardConversions(dbConfigProvider)
import conversions._
编译器错误是熟悉的:
could not find implicit value for parameter tt: slick.ast.TypedType[data.Timestamp]
我基本上陷入依赖注入,隐含地狱。有没有人想出一个在Slick 3中维护自定义转换的好方法?请分享。
答案 0 :(得分:2)
这就是特质派上用场的地方:
package dao
import java.sql.Date
import data.Timestamp
import play.api.db.slick.HasDatabaseConfig
import slick.driver.JdbcProfile
trait StandardConversions extends HasDatabaseConfigProvider[JdbcProfile] {
import driver.api._
implicit val timestampColumnType = MappedColumnType.base[Timestamp, Date](
{ data => new Date(data.value) },
{ sql => Timestamp(sql.getTime) }
)
}
然后只需在你的DAO中扩展这个特性:
class SomeDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider)
extends HasDatabaseConfigProvider[JdbcProfile]
with StandardConversions {
import driver.api._
// all implicits of StandardConversions are in scope here
}
答案 1 :(得分:0)
结合Roman的解决方案,您应该添加以下导入:
import play.api.libs.concurrent.Execution.Implicits.defaultContext