Grails 3 @Delegate表示法,使用域对象

时间:2016-01-06 16:53:41

标签: grails groovy gorm grails-3.0

在Grails 2.4.4中,我们使用了用作域对象包装器的类。

它们看起来像这样:

class Foo {
  @Delegate
  OurDomainClass ourDomainClass
  ...

}

这很有效,但是当尝试在Grails 3.0.11下编译时,我们得到了这个:

Foo.groovy:14:在非抽象类中不能有抽象方法。必须将类'Foo'声明为abstract或者必须实现方法'org.springframework.validation.Errors org_grails_datastore_gorm_GormValidateable__errors $ get()'。  @第14行,第1列。    class Foo {    ^

删除@Delegate注释将使编译通过,但是对基础类的方法的调用显然不起作用。

有没有办法解决这个问题或实现相同的行为并让它在Grails 3下通过编译?

3 个答案:

答案 0 :(得分:1)

好老 {ANDROID_STUDIO_LOCATION}/plugins/android/lib/templates/other/static hasMany = []是否胜任这项工作?当然包装器也是域类。

答案 1 :(得分:0)

您可以通过更改包装类来实现GORM特征来解决此问题:

class Foo implements GormValidateable, DirtyCheckable, Validateable {
    @Delegate
    OurDomainClass ourDomainClass
    ...
}

我进一步创建了自己的界面:

class Foo implements GormDelegateHack {
    @Delegate
    OurDomainClass ourDomainClass
    ...
}

interface GormDelegateHack extends GormValidateable, DirtyCheckable, Validateable {
}

我向grails-data-mapping提交了issue #856,但它可能是Groovy bug

答案 2 :(得分:0)

虽然@timbonicus 的解决方案适用于 Grails 3,但在 Grails 4 上它失败并出现多个错误。不幸的是,Groovy 的 @Delegate 有一个错误,不能像@timbonicus 已经指出的那样正常工作。

@Delegate 注释更改为 Groovy traits 对我来说似乎更容易。它仍然会被分离,因为 trait 支持多重继承(与类不同)并支持实现(与接口不同 - 在某些版本的 Java 上)。此外,没有必要像 embeddedhasManyhasOne 需要的那样添加对对象的另一个调用。

trait OurDomainClass {}

trait OurOtherDomainClass {}

class Foo implements OurDomainClass, OurOtherDomainClass {}

如果您要创建插件,则可以add methods at compile time with traits