Grails自动将字符串强制转换为我的一个域类

时间:2012-02-07 21:20:45

标签: 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.metaClass.toMyDomainClass = {->MyDomainClass.findByNameLike(delegate)}

1 个答案:

答案 0 :(得分:1)

您是对的:您可以通过覆盖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)
    }
}

但是,groovy不会在方法调用上以静默方式将String转换为其他类型。你必须像这样打电话给你的方法:

doBigThangs('stuff' as MyDomainClass)