2013-09-24 3 views
6

Innerhalb meiner neuesten Grails 2.3.0 Projekt verwende ich die @Mixin Annotation, um eine Hilfsklasse zu mischen, um meine controller mehr trocken zu halten.Controller @Mixin funktioniert nur nach der Neukompilierung der App

Das Mixin funktioniert nur, wenn einige Änderungen im Controller vorgenommen wurden, um eine Neukompilierung des Controllers zu erzwingen. Nach dem ersten Kompilieren (grails run-app) ist der Helfer nicht gemischt - ich bekomme einen MissingMethodException Versuch, auf eine Methode aus der Helferklasse zuzugreifen.

Hier ist mein Helfer witin src/groovy:

class ProjectHelper { 
    def withProject(id, Closure c) { 
     def project = Project.get(id) 
     if (project) { 
      c.call project 
     } else { 
      flash.message = 'Project not found!' 
      render view: 'myView' 
      return 
     } 
    } 
} 

und (einer) der controller, welche die verwendet ProjectHelper:

@Mixin(ProjectHelper) 
class ProjectController { 
    def index() { 
     withProject params.projectId, {project -> 
      // do something with the project 
     } 
    } 
} 

Als ich das Projekt mit grails clean und Starten der App cleane, ich den folgenden Fehler nach dem Zugriff auf project/index erhalten:

MissingMethodException occurred when processing request: 
    [GET] /<myApp>/project/ 
    No signature of method: <myPackage>.withProject() is applicable for argument types: 
    (java.lang.String, <myPackage>.ProjectController$_index_closure1_closure10) values: 
    [1, <myPackage>[email protected]] 

Nach einigen Änderungen in ReportController (z.B. Hinzufügen eines einzelnen Platzes) grails kompiliert 2 Quelldateien und die Methode withProject könnte verwendet werden. Der Zugriff auf project/index funktioniert wie erwartet.

Was läuft hier falsch? Ist es ein Fehler oder vermisse ich etwas?

aktualisieren

Es stellt sich heraus, dass ich völlig verpasst haben, dass die grails.util.Mixin gibt mir eine weitere Ausnahme mit (MissingPropertyException) durch Zugriff auf die Misch in Klasseneigenschaften (in meinem Fall: flash) zu fehlen (siehe JIRA this issue) die mit groovy.lang.Mixin arbeitet (nach der Neukompilierung).

Gibt es eine Möglichkeit, die groovy.lang.Mixin zur Laufzeit manuell neu zu kompilieren/zu mischen/muss ich eine andere Fehlerbehandlung für den else Teil finden, bis das Problem behoben ist?

Irgendwelche Vorschläge?

+0

Welche @Mixin? 'groovy.lang.Mixin' oder' grails.util.Mixin'? Versuchen Sie den anderen zu benutzen, wenn es ein grooviger Mix ist. – dmahapatro

+0

Ich habe beides versucht. Weder das eine noch das andere hat funktioniert. – aiolos

+0

@dmahapatro Ich habe es nochmal überprüft! Gestern war es etwas spät - ich habe das grails.util vermisst.Mixin gibt eine weitere Ausnahme. Ich werde meine Frage aktualisieren ... – aiolos

Antwort

2

Ich hatte regelmäßig in die gleiche MissingMethodException gelaufen, wenn Sie ein ähnliches Code-Wiederverwendungsmuster mit Mixins folgen.

In meinem Fall löste das Ändern von groovy.lang.Mixin zu grails.util.Mixin (oder genauer gesagt das Hinzufügen eines Imports für grails.util.Mixin zu meinem Controller) das Problem vollständig.

Wenn Sie keinen Zugriff auf die Controller-Variablen haben, müssen Sie möglicherweise warten, bis GRAILS-9905 aufgelöst wird. Ich sollte jedoch beachten, dass einige vorgeschlagene Umgehungslösungen in der Fehlerdiskussion aufgeführt sind.

+1

Keine Ahnung warum, aber das funktioniert nicht. Ich habe beide '@ Mixin' Annotations mit Import und ohne:/ – Opal

1

Die Abhilfe, die schließlich für mich gearbeitet wurde, um manuell die Mixin im Controller Konstruktor Injektion:

import com.example.MyMixin 

class SomethingController { 
    def SomethingController() { 
    SomethingController.metaClass.mixin(MyMixin) 
    } 
} 
+0

ausprobiert. Leider funktioniert das auch nicht mit Grails v. 2.3.7 oder vielleicht fehlt mir etwas. Wirklich nervig. – Opal

+0

@Opal Ich bin fest mit 2.2.4. Nicht sicher, aber vielleicht kannst du 'SomethingController.mixin MyMixin' direkt (ohne die' metaClass') machen. Du willst im Grunde ein [Laufzeit Mix] (http://groovy.codehaus.org/Runtime+mixins). – grammar31

+0

@ grammar31 Arbeitete für mich, ich benutze Grails 2.3.11. Danke für diese Antwort. –

Verwandte Themen