Ich habe eine Java \ Spring \ Hibernate-Anwendung - komplett mit Domänenklassen, bei denen es sich im Grunde um Ruhezustands-POJOs handelt.
Es gibt eine Funktion, von der ich denke, dass sie gut in Grails geschrieben werden kann.
Ich möchte die Domain-Klassen wiederverwenden, die ich in der Java-Hauptapplikation erstellt habe
Was ist der beste Weg dazu?
Sollte ich neue Domänenklassen schreiben, die die Java-Klassen erweitern? das klingt klebrig Oder kann ich Controller aus den Java-Domänenklassen generieren?
Was sind die besten Methoden für die Wiederverwendung von Java-Domänenobjekten in Grails \ Groovy? Ich bin mir sicher, dass es andere geben muss, die einige Stücke in grails \ groovy
schreibenWenn du von einem Tutorial weißt, das von einer solchen Integration spricht - das wäre großartig !!!
PS: Ich bin ein Neuling im Grals-Groovy und vermisse das Offensichtliche. Danke !!!
Wollen / müssen Sie wirklich Grails und nicht nur Groovy verwenden?
Grails können Sie wirklich nicht verwenden, um ein Teil einer bestehenden Web-App hinzuzufügen. Der ganze "convention over configuration" -Ansatz bedeutet, dass Sie ziemlich nach den Grails-Regeln spielen müssen, sonst macht es keinen Sinn, sie zu benutzen. Und eine dieser Regeln ist, dass Domain-Objekte Groovy-Klassen sind, die von der Grails-Laufzeit stark "verbessert" werden.
Es könnte möglich sein, dass sie bestehende Java-Klassen erweitern, aber ich würde nicht darauf wetten - und alle Spring- und Hibernate-Teile Ihrer bestehenden App müssten verworfen werden, oder zumindest müssten Sie ausgeben eine Menge Mühe, um sie in Grails arbeiten zu lassen. Sie werden den Rahmen bekämpfen, anstatt davon zu profitieren.
IMO Sie haben zwei Möglichkeiten:
Letzteres ist wahrscheinlich besser in Ihrer Situation. Grails soll sehr schnell neue Web-Apps erstellen, dort glänzt es. Das Hinzufügen von Inhalten zu einer bestehenden App ist nicht das, wofür sie gemacht wurde.
BEARBEITEN: Zur Klarstellung in den Kommentaren: Wenn Sie planen, grundsätzlich ein Dateneingabe- / Wartungs-Frontend für Daten zu schreiben, die von einer anderen App verwendet werden und die DB als einzigen Kommunikationskanal zwischen ihnen haben, könnte das mit Grails eigentlich recht gut funktionieren; Es kann sicherlich so konfiguriert werden, dass ein vorhandenes DB-Schema verwendet wird, anstatt ein eigenes DB-Schema aus den Domänenklassen zu erstellen (obwohl letzteres weniger Arbeit bedeutet).
Wenn wir wissen, wie gut Groovy und Grails die Integration mit bestehendem Java-Code übertreffen, denke ich, dass ich etwas optimistischer als Michael über Ihre Möglichkeiten bin.
Als Erstes verwenden Sie bereits Spring und Hibernate, und da Ihre Domain-Klassen bereits POJOs sind, sollten sie leicht zu integrieren sein. Alle Spring-Beans, die Sie haben könnten, können wie gewohnt in einer XML-Datei angegeben werden (in grails-app/conf/spring/resources.xml
) oder viel einfacher mit dem Spring Bohnenbauer Feature von Grails. Sie können dann in jedem Controller, View, Service usw. mit Namen aufgerufen und wie gewohnt bearbeitet werden.
Hier sind die Optionen, wie ich sie sehe, um Ihre Domain-Klassen und Ihr Datenbankschema zu integrieren:
Umgehen Sie GORM und laden / speichern Sie Ihre Domain-Objekte genauso, wie Sie es bereits tun.
Grails zwingt dich nicht, GORM zu verwenden, also sollte das ganz einfach sein: Erstelle einen .jar
deines Java-Codes (falls du es noch nicht getan hast) und wirf ihn in das lib
-Verzeichnis der Grails-App. Wenn Ihr Java-Projekt Mavenized ist, ist es noch einfacher: Grails 1.1 arbeitet mit Maven, also können Sie ein pom.xml
für Ihre Grails-App erstellen und Ihr Java-Projekt als Abhängigkeit hinzufügen, wie in jedem anderen (Java) Projekt.
In jedem Fall können Sie Ihre Klassen (und alle unterstützenden Klassen) import
bearbeiten und wie gewohnt fortfahren. Aufgrund der engen Integration von Groovy mit Java können Sie Objekte erstellen, aus der Datenbank laden, ändern, speichern, validieren usw., genau wie in Ihrem Java-Projekt. Sie werden auf diese Weise nicht alle Annehmlichkeiten von GORM bekommen, aber Sie hätten den Vorteil, dass Sie mit Ihren Objekten auf eine Weise arbeiten, die für Sie bereits Sinn macht (außer vielleicht mit etwas weniger Code dank Groovy). Du könntest diese Option immer zuerst ausprobieren, um etwas zum Laufen zu bringen, dann überlege dir später eine der anderen Optionen, wenn es zu diesem Zeitpunkt sinnvoll erscheint.
Ein Tipp, wenn Sie diese Option versuchen: abstrahieren Sie den tatsächlichen Persistenz-Code in einen Grails-Dienst ( StorageService
vielleicht) und lassen Sie Ihre Controller Methoden aufrufen, anstatt die Persistenz direkt zu behandeln. Auf diese Weise können Sie diesen Dienst bei Bedarf durch etwas anderes ersetzen, und solange Sie dieselbe Schnittstelle beibehalten, sind Ihre Controller nicht betroffen.
Erstellen Sie neue Grails-Domänenklassen als Unterklassen Ihrer vorhandenen Java-Klassen.
Dies könnte ziemlich einfach sein, wenn Ihre Klassen bereits als richtige Beans geschrieben sind, d. h. mit Getter / Setter-Methoden für alle ihre Eigenschaften. Grails werden diese geerbten Eigenschaften genauso sehen, wenn sie im einfacheren Groovy-Stil geschrieben wären. Sie können angeben, wie Sie jede Eigenschaft validieren, entweder mit einfachen Validierungsprüfungen (nicht null, nicht leer usw.) oder mit Schließungen, die kompliziertere Dinge ausführen und möglicherweise vorhandene Methoden in ihren POJO-Superklassen aufrufen.
Sie werden mit ziemlicher Sicherheit die Abbildungen über die GORM Mapping DSL anpassen müssen, um den Realitäten von Ihr vorhandenes Datenbankschema. Beziehungen wären dort, wo es schwierig werden könnte. Zum Beispiel könnten Sie eine andere Lösung haben, bei der GORM eine Join-Tabelle erwartet, obwohl es vielleicht sogar eine Möglichkeit gibt, um Unterschiede wie diese zu umgehen. Ich würde vorschlagen, so viel wie möglich über GORM und seine DSL-Karte zu lernen und dann mit einigen Ihrer Klassen zu experimentieren, um zu sehen, ob dies eine praktikable Option ist.
Lassen Sie Grails Ihre vorhandenen POJOs und Hibernate-Mappings direkt verwenden.
Ich habe das selbst nicht versucht, aber laut Grails Hibernate-Integration sollte dies möglich sein: Mit Grails können Sie auch Ihr Domänenmodell in Java schreiben oder ein vorhandenes Domänenmodell, das mit Hibernate gemappt wurde, wiederverwenden. Sie müssen lediglich die erforderliche Datei 'hibernate.cfg.xml' und die entsprechenden Zuordnungsdateien in den ' % PROJECT_HOME% / grails-app / conf / hibernate 'Verzeichnis. Sie können weiterhin alle in GORM erlaubten dynamischen Persistenz- und Abfragemethoden aufrufen. "
Googeln "gorm legacy" liefert eine Reihe hilfreicher Diskussionen und Beispiele, zum Beispiel diesen Blogbeitrag von Glen Smith (Co-Autor der bald erscheinenden Grails in Action ) ) wo er eine Hibernate-Mapping-Datei zeigt, die zur Integration in die "Legacy-DB von Hell" verwendet wird. Grails in Action hat ein Kapitel mit dem Titel "Advanced GORM Kungfu", das eine ausführliche Diskussion dieses Themas verspricht. Ich habe eine Vorab-PDF des Buches, und obwohl ich noch nicht zu diesem Kapitel gekommen bin, ist das, was ich bisher gelesen habe, sehr gut, und das Buch deckt viele Themen ab, die in anderen Grails-Büchern nicht angemessen diskutiert werden .
Tut mir leid, ich kann bei dieser letzten Option keine persönliche Erfahrung machen, aber es hört sich gut an (und ziemlich vielversprechend). Welche Option Sie auch wählen, lassen Sie uns wissen, wie sich herausstellt!
Dieser Beitrag enthält einige Vorschläge zur Verwendung von Grails für das Umbrechen bestehender Java-Klassen in ein Web-Framework .