2014-02-17 2 views
5

После обновления до Grails 2.3.5 я обнаружил, что мои миксины работают только при отключении JVM.Смешиватели Grails не работают при использовании JVM forking

Все мои контроллеры имеют подобный код

import util.MyMixin 

@Mixin(MyMixin) 
class MyController { 

Где MyMixin определяется в src/groovy/util и выглядит что-то вроде

package util 

class MyMixin { 
    private def aMethod(someArgs) { 
     // do something 
    } 
} 

Когда BuildConfig.groovy содержит следующий код

forkConfig = [maxMemory: 1024, minMemory: 64, debug: false, maxPerm: 256] 
grails.project.fork = [ 
    test: forkConfig, // configure settings for the test-app JVM 
    run: forkConfig, // configure settings for the run-app JVM 
    war: forkConfig, // configure settings for the run-war JVM 
    console: forkConfig // configure settings for the Swing console JVM 
] 

Тогда Я получаю следующую ошибку:

MissingMethodException occurred when processing request: 
No signature of method: MyController.aMethod() is applicable for argument types 

Где типы аргументов совпадают и, конечно же, код работает, когда у меня нет Разветвляющихся кода JVM в BuildConfig.groovy.

Есть ли что-то особенное, что мне нужно сделать, чтобы заставить миксины работать при разветвлении JVM? Я использую forking, потому что Grails 2.3.5 рекомендует его, и у меня были проблемы, когда я его не использовал: Grails 2.3.5 requiring "grails clean" after every code change

+0

Это [grails] (http://grails.org/doc/latest/api/grails/util/Mixin.html) или [groovy] (http://groovy.codehaus.org/gapi/groovy/ lang/Mixin.html) @Mixin? – dmahapatro

+0

Я не знал, что была разница. Как мне сказать? В импорте ничего нет с «Миксином» ... должно быть? – Jason

+0

Тогда, я думаю, вы используете 'groovy.lang.Mixin'. Попробуйте использовать другое. – dmahapatro

ответ

0

Мне было сложно использовать Mixins с объектами домена Grails и не удивляюсь, вы столкнулись с контроллерами. Домены, контроллеры и службы так сильно управляются Grails, неудивительно, что обычные @Mixins могут как-то сломаться. Я имел успех специально инъекционные методы через застройщик DSL метакласса как в:

targetClass.metaClass { 
    someMethod { someParam -> 
     // do something 
    } 
} 

Вы должны назвать это самостоятельно на всех целевые классах ... Это не так элегантно, как @Mixin, но это, кажется, работает.