2016-04-12 11 views
0

Ich überschreibe die Redirect-Methode von jedem Controller, den ich schrieb. Ich tat das, weilGrails Callback, wenn der Controller in der Laufzeit neu kompiliert

a) ich einige Variablen festlegen müssen, bevor die Umleitung tatsächlich

b ausgeführt wird) ich, dass global tun wollen, weil es der gleiche Code für jeden Controller ist und ich sein will DRY

Ich tat dies im Bootstrap, weil es ausgeführt wird, wenn der Server startet.

Code:

grailsApplication.controllerClasses.each() { controllerClass -> 
    if (controllerClass.fullName.startsWith("my.package")){ 
     def oldRedirect = controllerClass.metaClass.pickMethod("redirect", [Map] as Class[]) 
     controllerClass.metaClass.redirect = { Map args -> 
      // pre-redirect logic 
      args.put("some", "property")     
      oldRedirect.invoke delegate, args 
      // post-redirect logic 
     } 
    } 
} 

Hier ist das Problem:

Wenn ich entwickle, verwende ich das Nachladen Funktion/nur Compiler in der Zeit, die die Datei ohne die Notwendigkeit, neu kompiliert den Server neu zu starten. In diesem Fall wird der Controller neu aufgebaut und die überschriebene Redirect-Methode geht verloren. Hier

ist die Frage:

Gibt es einen Rückruf/einen anderen Weg, um herauszufinden, wenn eine Klasse im laufenden Betrieb neu kompiliert wird? Ich würde gerne überprüfen, ob ein Controller neu erstellt wurde und dann die Redirect-Methode wieder überschreiben!

Antwort

1

Ja, brechen Sie diese Funktionalität in ein Plugin auf und Sie können dann das Nachladen von Klassen beobachten und Ihre Änderungen erneut anwenden. Die documentation geht sehr ausführlich auf die Teilnahme an automatischen Nachladeereignissen ein.

Dies wäre der sauberste und am besten geeignete Weg, um das zu erreichen, was Sie tun möchten.

+0

klingt gut und danke für Ihre Lösung. Aber es scheint eine Menge Overhead zu sein, um ein Plugin für dieses kleine Feature zu erstellen. Hast du eine Idee, dies ohne ein Plugin zu tun? – Bernhard

+0

Keine Ahnung, wie es ohne ein Plugin geht. In der Tat ist das ein guter Hinweis darauf, dass der richtige Weg ein Plugin ist. Es ist nicht so viel Aufwand, wie Sie denken, um ein Plugin zu erstellen. Es ist sehr einfach, sobald Sie den Dreh raus haben und es ist ein gutes Werkzeug in Ihrer Toolbox. Plugins sind aus vielen Gründen sehr leistungsfähig. –

+0

Danke. Ein Plugin wird es sein. Kannst du mir einen Hinweis geben, wie ich das Plugin lokal einbinden kann? – Bernhard