我试图创建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
方法实际上是调用了两次,但第二次它得到一个null
值。
什么是错的怎么回事?