Vermeiden von ClassCastExceptions beim Reloading in Grails-Applikationen
Probleme von Experten Datenbanken
Einer der Hauptvorteile von Grails gegenüber anderen Frameworks bzw. Sprachen ist die schnelle Entwicklung. Bei laufendem Server können Änderungen vorgenommen und diese sind ohne einen lang dauernden Publizierungsvorgang verfügbar.
Unter bestimmten Umständen funktioniert allerdings der Reload von Änderungen in Controllern oder Services nicht bei laufendem Server. Nimmt man eine Änderung vor und lädt anschließend über den Browser die Seite neu, dann resultiert dies in eine ClassCast-Exception, die nur durch einen Server-Neustart zu beheben ist. Das Problem tritt unseren Beobachtungen zufolge insbesondere im Zusammenhang mit dem Spring-Cache-Plugin auf, das Annotation verwendet. Auch bei anderen Annotationstypen ist das Problem schon aufgetaucht und bekannt [1]
Lösungsideen
Ab der Grails-Version 2.0 ist dieses Problem behoben. Für andere Grails-Versionen lässt sich das Problem durch Installation des „AOP Reloading Fix“ Plugins [2] beheben. Dies funktioniert standardmäßig allerdings nur für die Umgebung (Environment) Development.
Wird eine eigene Umgebung für die Entwicklung eingerichtet, z.B. zum Umsetzen von Batches, dann werden die Erweiterungen des Plugins nicht angezogen. Durch Setzen der Variable grails.reload.enabled beim Starten der Anwendung kann dies umgangen werden und das Plugin wird angezogen. Die folgende Abbildung zeigt in IntelliJ den Befehl zum Starten der Umgebung devbatch. Zusätzlich werden die beiden Variablen grails.reload.enabled=true und grails.reload.location=. übergeben.
Links
[1] http://jira.grails.org/browse/GRAILS-6370
[2] AOP Reloading Fix Plugin