在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下通过编译?
答案 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 上)。此外,没有必要像 embedded
、hasMany
和 hasOne
需要的那样添加对对象的另一个调用。
trait OurDomainClass {}
trait OurOtherDomainClass {}
class Foo implements OurDomainClass, OurOtherDomainClass {}
如果您要创建插件,则可以add methods at compile time with traits。