Data binding Grails自动将字符串强制到我的一个域类中
我有一个域类,如:Data binding Grails自动将字符串强制到我的一个域类中,data-binding,grails,groovy,grails-domain-class,type-coercion,Data Binding,Grails,Groovy,Grails Domain Class,Type Coercion,我有一个域类,如: class MyDomainClass{ String name } 以及一个带有签名的接口,如: BigDecimal doBigThangs(MyDomainClass startHere) 我想这样称呼它 doBigThangs('stuff') 并让它自动将字符串“stuff”共享到相应的MyDomainClass中。这是我尝试过的,但也许我需要使用“asType”或其他什么 ExpandoMetaClass.enableGlobally() String.
class MyDomainClass{
String name
}
以及一个带有签名的接口,如:
BigDecimal doBigThangs(MyDomainClass startHere)
我想这样称呼它
doBigThangs('stuff')
并让它自动将字符串“stuff”共享到相应的MyDomainClass中。这是我尝试过的,但也许我需要使用“asType”或其他什么
ExpandoMetaClass.enableGlobally()
String.metaClass.toMyDomainClass = {->MyDomainClass.findByNameLike(delegate)}
您是正确的:您可以通过覆盖
asType
来添加类型转换。您的示例如下所示:
oldAsType = String.metaClass.getMetaMethod("asType", [Class] as Class[])
String.metaClass.asType = { Class c ->
if (c == MyDomainClass) {
MyDomainClass.findByNameLike(delegate)
} else {
oldAsType.invoke(delegate, c)
}
}
doBigThangs('stuff' as MyDomainClass)
但是,groovy不会在方法调用时将字符串自动转换为另一种类型。您必须像这样调用您的方法:
oldAsType = String.metaClass.getMetaMethod("asType", [Class] as Class[])
String.metaClass.asType = { Class c ->
if (c == MyDomainClass) {
MyDomainClass.findByNameLike(delegate)
} else {
oldAsType.invoke(delegate, c)
}
}
doBigThangs('stuff' as MyDomainClass)
有没有可能使用简单的多态性来处理这个问题?我将尝试最终理解多态性,并让您知道:pIt似乎“多态性”只是意味着“实现一个接口”,这仍然给我留下了一个问题:如何在字符串上实现该接口?谢谢,这正是我想要的。是否有某种方法可以使用类似于
super()
的东西来代替oldAsType
的东西?我正试图了解所有groovy概念。据我所知,一旦覆盖asType
元方法,旧方法就会消失,除非保存引用。据我所知,在没有编写“def oldAsType”的情况下,我的崩溃是def只是为了使事情变得本地化。。。奇怪的