2013-05-24 1 views
2

У нас есть множественный Grails 2.0.3 классов домена, которые используют @Mixin аннотацииПримеси по классам Grails Доменов сломанных в обновлении до 2.2

как так:

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

Это работает очень хорошо!

При попытке обновить до 2.2.2 микшины, похоже, не работают. Мы используем плагин fixtures для загрузки некоторых данных, и в процессе запуска мы получаем ошибки, связанные с геттерами и сеттерами, которые должны вводиться микстинами, которые не присутствуют.

Я нашел там есть некоторые проблемы с заводной 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 в последней версии Грааль или мне нужно реорганизовать свой код, чтобы избежать их?

обновление: помещения Mixin, который находится в Src/заводной выглядит следующим образом:

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 
} 
+1

Как выглядит «PremisesMixin»? Я был в одной лодке, несколько месяцев назад, до версии 2.2.0, так как вы, но Grails @Mixin работал для меня. – dmahapatro

+0

отредактирован, чтобы включить часть содержимого mixin – aeischeid

+1

Я не вижу 'факс' в статических' полях'. И где «помещения». :) – dmahapatro

ответ

1

Это работает для меня в 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. Как было premises доступны в классе подмешать? Я не вижу, где это определено в классе Mixin. 2. На самом деле, когда вы столкнулись с ошибкой, run-app или во время создания Clinic (похоже на то, что сделано в тесте выше)?

+0

Помещения определены в клинике не в помещении mixin, только геттеры/сеттеры на классе mixin. Я могу попробовать положить его на mixin и посмотреть, поможет ли это так или иначе. в настоящее время ошибки, которые я вижу, происходят в run-app, когда время загрузки бутстрапа инициирует кучу вещей, используя плагин fixtures. – aeischeid

+0

Поскольку вы хотите, чтобы помещения были доступны для клиник, док, медсестра и т. д., было бы полезно добавить Помещения в Миксине? Поскольку это время компиляции Mixin, помещения должны быть доступны для всех. Еще одна вещь, я не использовал светильники для своих тестов, это был простой ванильный код. – dmahapatro

+0

Верно, я попробую, когда закончится долгий уик-энд. спасибо за помощь в этом! – aeischeid

Смежные вопросы