我試圖在Squeryl中創建自定義字段類型。該字段代表Isin code,所以它由一個字符串字段進行備份。繼example on the documentation,我已經創造了新的ISIN前添加了一個簡單的驗證(別提了ISIN編碼是什麼,或者驗證程序的工作原理):Squeryl自定義字段類型
trait Domain[A] { self: CustomType[A] =>
def validate(a: A): Unit
validate(value)
}
class Isin(v: String) extends StringField(v) with Domain[String] {
println("instantiating Isin")
override def validate(s: String) {
println("calling validate with " + s)
assert(checkIsin(s))
}
private def checkIsin(isin: String): Boolean = {
// never mind the exact procedure
}
}
我增加了一些println
找出是怎麼回事。我用這個域的模型裏面像
case class Asset(
val id: Long = 0,
val isin: Isin
) extends KeyedEntity[Long]
object Asset {
import Database.assets
def create(isinCode: String) {
inTransaction {
assets.insert(new Asset(isin = new Isin(isinCode)))
}
}
}
現在,當我打電話Asset.create("US0378331005")
(有效ISIN)我得到一個異常。在堆棧跟蹤中,事實證明,這個例外是由於init
方法對null
值的調用,該值應該被傳遞給checkIsin
。事實上,println
報表打印
calling validate with US0378331005
Instantiating Isin
calling validate with
如此看來,該validate
方法實際調用兩次,但第二次就得到一個null
值。
這是怎麼回事?