grails - Grails Domains类上的Mixins在升级到2.2中被破坏

标签 grails groovy grails-domain-class

我们有多个使用@Mixin批注的Grails 2.0.3域类

像这样:

@Mixin(PremisesMixin)
class Clinic { 
    Premises premises
    String name
    ....

它真的很好!

在尝试更新到2.2.2时,mixin似乎不起作用。我们使用fixtures插件来引导一些数据,并且在启动过程中,我们收到与应该由mixins不存在的getter和setter方法相关的错误。

我确实发现在最新版本的grails中存在groovy mixins的问题,但是有Grails特定的替代http://jira.grails.org/browse/GRAILS-9901

但改为
@grails.util.Mixin(PremisesMixin)
class Clinic { ...

给出其他错误。
Getter for property 'fax' threw exception; nested exception is java.lang.reflect.InvocationTargetException

那么,有没有一种方法可以在最新版本的grails中的Grails域类上使用mixins,还是需要重构代码以避免它们?

更新:
src / groovy中的前提mixin看起来像这样:
class PremisesMixin implements Serializable {
private static final long serialVersionUID = 1L

static fields = ['addressLine1', 'addressLine2', 'city', 'county', 'state', 'postalCode', 'plus4', 'phone', 'latitude', 'longitude']

String getAddressLine1() { premises?.addressLine1 }
void setAddressLine1(String addressLine1) { premises?.addressLine1 = addressLine1 }

String getAddressLine2() { premises?.addressLine2 }
void setAddressLine2(String addressLine2) { premises?.addressLine2 = addressLine2 }

String getCity() { premises?.city }
void setCity(String city) { premises?.city = city }

...

String getPhone() { premises?.phone }
void setPhone(String phone) { premises?.phone = phone }

String getFax() { premises?.fax }
void setFax(String fax) { premises?.fax = fax }

    ...

    // Workaround for open Groovy bug with Mixins http://jira.codehaus.org/browse/GROOVY-3612
String toString() {
    this as String
}
}

前提看起来像这样:
class Premises {
String addressLine1
String addressLine2
String city
String state
    ...

String county
String phone
String fax

Double latitude
Double longitude
}

最佳答案

它在Grails 2.2.2中通过以下设置对我有效:

@grails.util.Mixin(PremisesMixin)
class Clinic {
    String name

    static constraints = {
    }
}

class Premises {
    String fax

    static constraints = {
        fax nullable: true
    }
}

class PremisesMixin {
    //Without this a runtime error is thrown, 
    //like property 'premises' not found in Clinic.
    Premises premises

    void setFax(String fax) {
        premises?.fax = fax
    }
    String getFax() { 
        premises?.fax 
    }
}

//Test Case
def clinic = new Clinic(name: "TestClinic")
clinic.premises = new Premises().save(flush: true, failOnError: true)
clinic.fax = "123456"

clinic.save(flush: true, failOnError: true)

Clinic.list().each{assert it.fax == '123456'}
Premises.list().each{assert it.fax == '123456'}

尽管我在Mixin分支中对其进行了修改,但尚未针对2.2.x版本修改master转换的逻辑,但更改是分钟(使用了通用类文字)。

几个问题:
1.如何在mixin类中访问premises?我看不到它在Mixin类中定义的位置。
2.实际上,什么时候遇到错误run-app或在创建Clinic时(类似于上面的测试中所做的)?

关于grails - Grails Domains类上的Mixins在升级到2.2中被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16740232/

相关文章:

java - 如何在 Grails 中创建 Controller 的 "clone"?

groovy - 不允许在 Groovy 中使用 setter

grails View 参数与非域类绑定(bind)

grails - Grails findBy无法与Or/And条件结合使用

grails - Grails域对象未在gsp中刷新

grails - 在Grails taglib中获取动态Config参数的问题

hibernate - 如何解释使用Hibernate查询的这种行为?是由于Hibernate的懒惰吗?

grails - 如何将groovy变量和javascript值都传递给grails Controller ?

grails - 用于休息和其他操作的Grails UrlMappings

gradle - 如何使用 Gradle Kotlin DSL 从 gradle 脚本中的单独 .gradle 文件中调用函数?