In diesem zweiten Teil über Spicefactory werden wir uns mit den Details der Erstellung eines Grails-Plug-ins für dieses Framework beschäftigen. Seien Sie darauf vorbereitet, eine Menge Code zu lesen!
Lassen Sie uns versuchen, es mit Grails zu verbinden. JPA Pimento stützt sich zunächst auf einen EntityManager, der über Cinnamon Servlet bereitgestellt wird. Grails verfügt normalerweise nicht über einen EntityManager, verwendet aber Hibernate, das über eine Implementierung verfügt. Die Konfiguration von Pimento basiert auf Spring auf der Serverseite, so dass ich davon ausging, dass die Anpassung der Konfiguration zur Verwendung der von Grails konfigurierten SessionFactory nicht allzu schwierig sein sollte. Pimento wird mit der Datei pimento-spring.xml ausgeliefert, die das Backend für Pimento konfiguriert. Diese Datei verwendet einen zimtspezifischen Namespace für Spring, um zu definieren, welche Dienste offengelegt werden sollen. Darüber hinaus verlässt sie sich auf die Konfiguration von Spring-Annotationen, um die EntityManagerFactory in einige Beans zu injizieren. Das macht die Integration in Grails umso schwieriger. Den größten Teil der Konfiguration in dieser Datei wollen wir so belassen, wie er ist, insbesondere die Zimt-bezogenen Dinge. Was wir ändern möchten, ist die Definition der EntityManagerFactory. Die Pimento-Konfiguration verwendet die springs-Implementierung für die LocalEntityManager-Suche, die die persistence.xml auf dem Klassenpfad durchsucht. In einer Grails-Anwendung wird die Persistenz von den Core-Plugins konfiguriert und wir wollen uns nicht einmischen. Glücklicherweise enthält hibernate eine weitere Implementierung der EntityManagerFactory, die mit einer vorkonfigurierten SessionFactory injiziert werden kann. Wir ersetzen also die EntityManager-Konfiguration durch den folgenden XML-Schnipsel:
Diese Konfiguration nimmt die vorkonfigurierte SessionFactory von Grails und verpackt sie in eine EntityManagerFactory, die von Pimento verwendet werden kann.
Konfiguration der Laufzeit-Webanwendung
Jetzt müssen wir einige Änderungen an der Konfiguration unserer Webanwendung vornehmen. Der einfachste Weg, dies mit Grails zu bewerkstelligen, besteht darin, die Funktionalität in einem Plug-in zu verpacken und den Erweiterungspunkt für die Laufzeitkonfiguration zu verwenden, um die Änderungen vorzunehmen. Mit
def doWithWebDescriptor = { xml ->
// Servlets
def servlets = xml.servlet
servlets[servlets.size() - 1] + {
Servlet {
'Servlet-Name'("Zimt")
'servlet-class'("org.spicefactory.cinnamon.web.CinnamonServlet")
'init-param' {
param-name'("configLocation")
param-value'("Frühling")
}
load-on-startup'("1")
}
}
// Servlet-Zuordnungen
def servletMappings = xml.'servlet-mapping'
servletMappings[servletMappings.size() - 1] + {
'servlet-mapping' {
'Servlet-Name'("Zimt")
url-pattern'("/service/*")
}
}
}
Dadurch wird das CinnamonServlet zur web.xml hinzugefügt.
ApplicationContext Manipulation
Auf ähnliche Weise möchten wir die Spring-Konfigurationsdatei laden, die wir von pimento-spring.xml angepasst haben. Wenn Sie die Datei in
def dependsOn = [hibernate:GrailsPluginUtils.grailsVersion]
Jetzt wird unser Plugin nach dem Hibernate-Plugin geladen und konfiguriert, das die SessionFactory konfiguriert. Das zweite Anliegen ist das Laden der XML-Konfiguration. Die Datei SpicefactoryGrailsPlugin.groovy hat einen ähnlichen Abschnitt für das Abfangen des ApplicationContext. In diesem Teil ist ein BeanBuilder verfügbar. Dieser ist sehr nützlich, wenn Sie Beans aus einer .groovy-Datei laden möchten. Leider wird das Laden von Beans aus einer XML-Datei nicht so gut unterstützt. Wir haben einen Zimt-Namensraum in der XML-Datei, der eine einfache Konfiguration der exponierten Dienste ermöglicht. In ähnlicher Weise wird die <context:annotation-configuration/> verwendet, um die EntityManagerFactory zu injizieren. Dies in eine Konfiguration im Stil von Grails' BeanBuilder zu konvertieren, wäre ziemlich schwierig. Nach stundenlangem Suchen habe ich diese Lösung gefunden, die zu funktionieren scheint:
def doWithSpring = {
new XmlBeanDefinitionReader(
getSpringConfig().getUnrefreshedApplicationContext()
).loadBeanDefinitions("classpath:pimentoSpringBeans.xml");
}
Da wir einen BeanPostProcessor in der XML-Datei haben, benötigen wir einen ApplicationContext, um ihn zu laden. Außerdem müssen Sie darauf achten, dass Sie den ApplicationContext nicht aktualisieren: Die verwendete Implementierung kann nur einmal aufgefrischt werden und das Grails-Framework wird dies tun, wenn die Anwendung vollständig konfiguriert ist. SWC-Dateien Wenn Sie Pimento verwenden, benötigen Sie die SWC-Dateien des Frameworks, die dem Flex-Compiler zur Verfügung stehen. Es gibt verschiedene Möglichkeiten, SWF zu kompilieren. Ich bevorzuge die Verwendung des Web-Tier-Compilers mit Grails, da dies eine einfache Neukompilierung und Integration in Ihre Grails-Anwendung ermöglicht. Der Web-Tier-Compiler ist auch im Flex-Plugin für Grails enthalten, aber dieses Plugin enthält auch viele andere Funktionen und die Version des Compilers ist ziemlich alt. Daher habe ich zunächst ein Grails-Plug-in erstellt, das nur den Web-Tier-Compiler installiert. Dieses Plug-in ist diesem Blog beigefügt. Das spicefactory plug-i kann nun ohne das web-tier Plug-in verwendet werden, wenn Sie die kompilierten SWFs in den web-app Ordner legen. Um die Verwendung mit dem Web-Tier-Compiler zu ermöglichen, werden die erforderlichen SWC-Dateien jedoch in das Verzeichnis /web-app/WEB-INF/flex/user_classes kopiert, damit der Web-Tier-Compiler sie beim Kompilieren Ihrer MXML-Dateien erkennt. Fazit</big Das resultierende Grails-Spicefactory-Plugin ist diesem Blog beigefügt. Anwendungen, die es verwenden, müssen spicefactory-Annotationen zu den Groovy-Domänenklassen hinzufügen, die sie offenlegen möchten, und AS-Kopien dieser Klassen schreiben, wie in diesem Blog beschrieben. Danach kann der AS3 EntityManager von der Flex-Anwendung aus verwendet werden, um die Datenbank zu manipulieren. Viel Spaß bei der AS3-Programmierung!
Verfasst von
Maarten Winkels
Contact