Squeryl でカスタム フィールド タイプを作成しようとしています。このフィールドはIsin コードを表すため、文字列フィールドによってバックアップされます。ドキュメントの例に従って、新しい isin を作成する前に簡単な検証を追加しました (Isin コードが何であるか、または検証手順がどのように機能するかは気にしないでください)。
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
メソッドは実際には 2 回呼び出されているように見えますが、2 回目はnull
値を取得します。
何が間違っているのですか?