2016-01-02 38 views
2

我正在嘗試爲新的滑動3項目構建自定義數據庫列轉換器。使用MappedColumnType很容易,但必須導入驅動程序api。對於單個DAO類中的一次性類型,這是非常簡單的。但我想在我的所有DAO對象中使用自定義列類型。我一直無法以編譯器可以識別這些含義的方式來構建我的導入。管理滑動3項目中的MappedColumnType轉換

這是我想構建的庫類型的示例。它有一個單獨的轉換器,非常類似於許多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

我建議添加播放框架標籤,因爲您在播放中使用滑動。 – Roman

回答

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 
} 
+0

這是一個好主意,但我試過了,它不起作用。問題似乎是隱式的val不會被拉入with-class範圍。也許我搞砸了。我會再次確認.... – Chris

+0

確認這不起作用。我得到錯誤:'找不到參數tt:slick.ast.TypedType [data.Timestamp]'的隱式值。 – Chris

+0

@Chris:呃不知道這裏到底是什麼問題......上面的代碼與我在我的項目中使用的方法類似。如果將其直接放入DAO,隱式轉換是否可以工作? – Roman

0

在與羅馬的解決方案組合,你應該添加以下進口:

import play.api.libs.concurrent.Execution.Implicits.defaultContext