
Wenn Sie die Anforderungen für die nächste Unternehmenswebanwendung für den internen Gebrauch lesen, handelt es sich in der Regel (meiner Erfahrung nach) um ein und denselben Satz: eine relationale Datenbank zum Speichern von Daten, die häufig von der vorherigen Version der Anwendung geerbt wurde, eine große Anzahl von Formen mit unterschiedlichen Schwierigkeitsgraden (aber gleichzeitig typisch) für die Dateneingabe, eine Vielzahl von Berichtsformularen, komplexe Geschäftslogik, Integration in andere Anwendungen - von der Buchhaltung bis zum Supply Management, mehrere tausend gleichzeitig arbeitende Benutzer. Was fällt mir normalerweise ein?
"Also nehme ich das DBMS, das ich kenne und das zu ihren Datenmengen passt, befestige Hibernate / JPA, schreibe die Anwendung auf Spring Boot, mache die REST-API verfügbar und schreibe den Client auf das JS-Framework, höchstwahrscheinlich Angular / React."
„Ja, wir müssen noch Spring Security schrauben. Schreiben Sie eine Einschränkung für den Zugriff auf Daten für verschiedene Abteilungen und Rollen - auf der Ebene von Datenbankzeilen oder Datenobjekten. Wie geht das? Einreichung oder VPD, müssen Sie sehen. "
"Ugh, ich muss ein paar DAOs schreiben - sie sind schnell erledigt, aber es gibt viele von ihnen."
"Und die Konvertierung von Entity zu DTO - ich verwende ModelMapper ."
"Die Hauptsache ist, nicht zu vergessen, den Auszubildenden an die faulen Attribute zu erinnern und sich anzuschließen, damit es nicht so ist wie beim letzten Mal."
"Fir-Bäume, während Sie Geschäftslogik starten, müssen Sie so viel Service-Code schreiben ..."
Dieser Artikel richtet sich an diejenigen, die mindestens ein paar Unternehmensanwendungen von Grund auf auf Spring / Spring Boot geschrieben haben und jetzt der Meinung sind, dass es schön wäre, die Entwicklung derart unterschiedlicher, aber gleichzeitig ähnlicher Anwendungen zu beschleunigen. Als nächstes werden wir sehen, wie Sie „typische“ Aufgaben mithilfe der
CUBA-Plattform entfernen können .
Ein anderer Rahmen?

Der erste Gedanke, wenn dem Entwickler ein neues Framework (und insbesondere CUBA) angeboten wird, lautet: „Warum sollte ich mich damit beschäftigen? Ich werde den vertrauten Spring Boot nehmen und alles erledigen. " Und das ist vernünftig. Das neue Framework ist das Studium neuer Entwicklungsansätze, neuer Fallstricke und Einschränkungen, die Sie bei der Entwicklung in einem vertrauten Framework geschickt zu vermeiden gelernt haben.
Aber als ich anfing, mich auf CUBA zu entwickeln, musste ich meine Fähigkeiten mit Spring nicht viel ändern. Natürlich musste ich ein wenig Zeit damit verbringen, die Plattform zu verstehen, aber dies war kein radikaler Zusammenbruch aller Gewohnheiten, sondern eine kleine Verschiebung der Entwicklungsfähigkeiten.
Infolgedessen verschwand der Code für DTO, seitenweise Datenausgabe, Datenfilterung (Analyse der in das Formular übertragenen Parameter und Zusammenstellung von Anforderungen). Gleichzeitig musste ich fast nicht an den Spring Security-Einstellungen basteln und Admin-Code, Anmeldeformulare und Sprachumschaltlogik für die Benutzeroberfläche schreiben.
Lassen Sie uns von vorne beginnen und sehen, wie sich die CUBA-Entwicklung mit der üblichen Art der Entwicklung im Frühjahr vergleichen lässt und wie Sie mithilfe Ihrer Erfahrung und des Lernens einiger neuer Dinge letztendlich Anwendungen schneller erstellen können.
Das Hauptaugenmerk des Artikels liegt auf der Entwicklung der Serverseite, um den Fokus nicht zu verlieren und die Textmenge auf einem akzeptablen Niveau zu halten.
Spring-Anwendungsarchitektur
In 90% der Fälle sehen Sie ein ähnliches Bild, wenn Sie Google "Spring Application Architecture" oder "Spring Application Architecture" eingeben. Eine klassische dreischichtige Anwendung mit Modulen, die einigen Schichten gemeinsam sind.

Domänenmodell (Domänenmodell
) - Entitätsklassen der Domäne (Entitäten), die in der Regel in der Datenbank gespeichert sind. Klassen werden normalerweise manuell erstellt, aber Sie können die Struktur basierend auf dem Datenbankschema automatisch erstellen.
Repository-Schicht (Repository-Schicht) - Eine Reihe von Klassen, die die Arbeit mit dem Data Warehouse ermöglichen. In der Regel verwendet diese Schicht verschiedene ORM-Frameworks und enthält Logik zum Ausführen von CRUD-Operationen. Wenn wir über Spring sprechen, sind die Repositorys ziemlich kompakt, hauptsächlich aufgrund von JPA-Abfragemethoden. Oft müssen Sie jedoch die Auswahllogik aus der Datenbank schreiben und sie manuell dem Domänenmodell zuordnen.
Serviceschicht - Eine Anwendungsschicht, die die Implementierung von Geschäftslogik und themenspezifischen Informationsverarbeitungsalgorithmen enthält. Dies ist nützlich bei komplexen Verarbeitungsalgorithmen sowie für die Arbeit mit Daten aus verschiedenen Quellen (Datenbanken, externe Anwendungen, Dienste aus dem Internet usw.).
Web / Controller Layer - Klassen, die für die REST-API verantwortlich sind. Es können auch Seitenvorlagendateien auf dieser Ebene vorhanden sein, wenn wir ein Framework wie Thymeleaf, Velocity sowie Klassen verwenden, die für das Rendern und Behandeln von Benutzeroberflächenereignissen verantwortlich sind, wenn etwas wie GWT, Vaadin, Wicket usw. verwendet wird.

In der Regel arbeiten Controller mit DTO und nicht mit Klassen aus der Domänenschicht. Daher wird der Anwendung die Funktionalität zum Konvertieren von DTO in Entity und umgekehrt hinzugefügt.
Wenn Ihnen all das klar ist oder sogar die „reguläre Kapitänschaft“ ausgezeichnet ist. So können Sie problemlos mit CUBA arbeiten.Referenzanwendung - Tierklinik
Schauen wir uns ein bestimmtes Beispiel an und schreiben Code. Für den Frühling gibt es eine Referenzanwendung - Pet Clinic auf
GitHub . Diese Anwendung wurde in verschiedenen Versionen mit verschiedenen Werkzeugen erstellt - vom klassischen Spring bis zu Kotlin und Angular. Als nächstes werden wir sehen, wie diese Anwendung auf CUBA gemacht wird. Für diejenigen, die mit der Spring-Version nicht vertraut sind, gibt es hier guten Text; Auszüge davon werden in diesem Artikel verwendet.
Datenmodell

Das ER-Diagramm ist in der obigen Abbildung dargestellt. Das Domänenmodell wiederholt diese Struktur, es werden mehrere Klassen mit gemeinsamen Feldern hinzugefügt und Entitätsklassen werden bereits von ihnen geerbt. UML finden Sie in der
Präsentation, die ich zuvor erwähnt habe.
Repository-Schicht
Die Anwendung enthält vier Repositorys, die für die Zusammenarbeit mit den Entitäten Eigentümer (Eigentümer), Haustier (Haustier), Besuch (Besuch) und Tierarzt (Tierarzt) verantwortlich sind. Repositorys werden mit Spring JPA geschrieben und enthalten praktisch keinen Code, nur Methodendeklarationen. Dem Repository, das mit der Entität "Eigentümer" zusammenarbeitet, wurde jedoch eine Abfrage hinzugefügt, mit der Eigentümer und ihre Haustiere in einem Beispiel aus der Datenbank extrahiert werden können.
Benutzeroberfläche
Die Pet Clinic verfügt über neun Seiten, auf denen Sie eine Liste der Besitzer, ihrer Haustiere und eine Liste der Tierärzte anzeigen können. Die Anwendung bietet eine einfache CRUD-Funktionalität: Es ist möglich, einige Daten zu bearbeiten - Besitzer, Haustiere, und Sie können auch Besuche in der Klinik hinzufügen. Wie bereits erwähnt, werden wir die Benutzeroberfläche in diesem Artikel nicht ausführlich behandeln.
Optional
Neben Code für einfache Manipulationen mit Entitäten verfügt die Anwendung über interessante Funktionen, die die Funktionen von Spring demonstrieren sollen:
- Caching - Die Liste der Tierärzte wird nur einmal aus der Datenbank ausgewählt und dann im Cache gespeichert, bis der Anwendungsserver neu gestartet wird.
- Überprüfen Sie das Ausfüllen der erforderlichen Felder, wenn Sie Informationen zu einem neuen Haustier eingeben.
- Formatieren Sie den Tiertyp, bevor Sie ihn anzeigen.
- i18n - Die Anwendung unterstützt Englisch und Deutsch.
- Transaktionsverwaltung - Einige Transaktionen sind als schreibgeschützt markiert.
Randnotizen

Ich mag dieses Bild wirklich. Es spiegelt zu 100% meine Gefühle bei der Arbeit mit Frameworks wider. Um das Framework effektiv nutzen zu können, müssen Sie verstehen, wie es im Inneren aufgebaut ist (egal was passiert). Wie viele von Ihnen haben sich beispielsweise gefragt, wie viele Klassen erforderlich sind, damit die JPA-Schnittstelle funktioniert?
Selbst in einer kleinen Anwendung wie Pet Clinic gibt es ein bisschen Spring Boot-Magie:
- Es gibt keine Konfiguration für den Cache (mit Ausnahme der Annotation
@Caheable
). Spring Boot „weiß“ jedoch, wie der gewünschte Cache gestartet wird (in diesem Fall EhCache). - CRUD-Repositorys sind nicht mit
@Transactional
Annotation markiert (und ihre übergeordnete Klasse ist org.springframework.data.repository.Repository
), aber alle save()
-Methoden funktionieren wie erwartet.
Aber trotz aller "impliziten" ist Spring Boot sehr beliebt. Warum? Es ist transparent und vorhersehbar. Gute Dokumentation und Open Source Code ermöglichen es, die Prinzipien zu verstehen und gegebenenfalls die Implementierungsdetails zu untersuchen. Es scheint mir, dass jeder solche Frameworks, Transparenz und Vorhersehbarkeit liebt - der Schlüssel zur Stabilität und Wartbarkeit der Anwendung.
Tierklinik auf der CUBA-Plattform
Schauen wir uns die mit CUBA erstellte Tierklinik aus Sicht des Spring-Entwicklers an und versuchen zu verstehen, wo Sie speichern können.Der Quellcode der Anwendung ist auf
GitHub zu finden. Darüber hinaus verfügt die CUBA-Plattform über eine sehr anständige
Dokumentation in Russisch und Englisch, in der ausführlich erläutert wird, wie diese Plattform ordnungsgemäß entwickelt wird. Viele Beispiele auf
GitHub , einschließlich mehrerer Tutorials. In dem Artikel werde ich oft auf die Dokumentation verweisen, um nicht zweimal dasselbe zu schreiben.
CUBA-Anwendungsarchitektur
Die CUBA-Anwendung besteht aus den im Diagramm gezeigten Modulen.
Global (globales Modul) - Enthält Entitätsklassen, CUBA-Darstellungen und Serviceschnittstellen, die in verschiedenen Modulen verwendet werden.
Kern (Servicemodul) - Hier werden der Code der Services, die die Geschäftslogik implementieren, sowie der Code für die Arbeit mit dem Data Warehouse platziert. Es ist zu beachten, dass diese Klassen nicht von anderen Anwendungsmodulen verfügbar sind. Dies erfolgt, um eine
separate Bereitstellung für eine bessere Skalierbarkeit bereitzustellen. Um Dienste in anderen Anwendungsmodulen verwenden zu können, müssen Sie die im globalen Modul deklarierten Schnittstellen verwenden.
GUI, Web, Desktop, Portal - Diese Module enthalten Code für Klassen, die sich auf die Ereignisverarbeitung der Benutzeroberfläche beziehen, sowie zusätzliche REST-Controller, wenn die
integrierte CUBA-
REST-API nicht ausreicht.
Um Entwicklerzeit zu sparen, verfügt CUBA über ein
Studio - eine kleine grafische Entwicklungsumgebung, die Routinearbeiten wie das Generieren von Entitäten, das Schreiben von Diensten in Konfigurationsdateien usw. unterstützt. über die grafische Oberfläche. Um die Schnittstelle der entwickelten Anwendung zu generieren, gibt es einen (fast) WYSIWYG-Editor.
Daher besteht die auf der CUBA-Plattform basierende Anwendung aus zwei Hauptmodulen - Core und GUI, die separat bereitgestellt werden können, sowie einem gemeinsamen Modul - Global. Schauen wir uns das Design dieser Module genauer an.
Globales Modul
Entitätsmodell
Die Entitätsmodellierung in einer CUBA-Anwendung unterscheidet sich nicht von der, an die Spring-Entwickler gewöhnt sind. Domänenklassen werden erstellt und mit Anmerkungen
@Table
,
@Entity
usw. versehen. Diese Klassen werden dann in der Datei
persistence.xml
registriert.
Beim Schreiben von Pet Clinic habe ich nur die Klassen aus der ursprünglichen Spring-Anwendung kopiert und ein wenig geändert. Hier sind einige kleine Ergänzungen, die Sie kennen müssen, wenn Sie auf der CUBA-Plattform schreiben:
- CUBA führt das Konzept des „ Namespace “ für jede Komponente der Anwendung ein, um Doppelungen von Tabellennamen in der Datenbank zu vermeiden. Aus diesem Grund wurde jeder Entität das Präfix „petclinic $“ hinzugefügt.
- Es wird empfohlen, die Annotation
@NamePattern
- ein Analogon zur toString()
-Methode für die lesbare Anzeige von Entitäten in der Benutzeroberfläche.
Natürliche Frage: "Was fügt CUBA außer Präfixen und deklarativem
toString()
?" Hier ist eine unvollständige Liste zusätzlicher Funktionen:
- Basisklassen mit automatisch generierten IDs von Integer bis UUIDs.
- Nützliche Markierungsschnittstellen mit zusätzlichen Funktionen:
- Versioniert - zur Unterstützung der Versionierung von Entitätsinstanzen.
SoftDelete
- zur Unterstützung des „logischen“ Löschens von Datensätzen in der Datenbank.Updatable
- Felder werden hinzugefügt, um die Aktualisierung von Datensatz, Benutzername und Uhrzeit zu registrieren.Creatable
- Felder werden hinzugefügt, um die Erstellung eines Datensatzes zu registrieren.
Weitere Informationen zur Entitätsmodellierung finden Sie in der Dokumentation . - Skripte zum Erstellen und Aktualisieren der Datenbank werden automatisch mit CUBA Studio generiert.
Bei der Erstellung eines Datenmodells für Pet Clinic ging es darum, Entitätsklassen zu kopieren und ihnen CUBA-spezifische Dinge hinzuzufügen, die ich oben erwähnt habe.Ansichten
Das Konzept der „Darstellungen“ in CUBA mag etwas ungewöhnlich erscheinen, ist aber leicht zu erklären. Eine Ansicht ist eine deklarative Methode zum Deklarieren von Attributen, deren Werte aus dem Data Warehouse abgerufen werden müssen.
Beispielsweise müssen Sie Besitzer und ihre Haustiere aus der Datenbank (oder Tierärzten und ihrem Beruf) extrahieren. Eine sehr häufige Aufgabe beim Erstellen einer Schnittstelle besteht darin, abhängige Daten in derselben Form wie die Hauptdaten anzuzeigen. Im Frühjahr kann dies über einen JPA-Join erfolgen ...
@Query("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id") public Owner findById(@Param("id") int id);
... oder setzen Sie EAGER / LAZY-Attribute, um die Sammlung der Hauptentität im Kontext einer einzelnen Transaktion abzurufen.
@ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "vet_specialties", joinColumns = @JoinColumn(name = "vet_id"), inverseJoinColumns = @JoinColumn(name = "specialty_id")) private Set<Specialty> specialties;
In CUBA können Sie dies über EntityManager und JPQL (jeder weiß wie) oder über die Ansicht und DataManager tun:
- Erstellen Sie eine Präsentation (kann in CUBA Studio oder manuell in der Konfiguration erfolgen)
<view class="com.haulmont.petclinic.entity.Vet" extends="_minimal" name="vet-specialities-view"> <property name="specialities" view="_minimal"> </property> </view>
- Verwenden Sie den DataManager, um Folgendes abzurufen:
public Collection<Vet> findAll() { return dataManager.load(Vet.class) .query("select v from cubapetclinic$Vet v") .view("vet-specialities-view") .list(); }
Sie können verschiedene Ansichten für verschiedene Aufgaben mit den gewünschten Attributen und Verschachtelungsebenen von Entitäten erstellen. Es gibt einen ausgezeichneten
Artikel über Mario Davids
Blogpostings .
Für die App Pet Clinic wurden sechs verschiedene Beiträge eingereicht. Die meisten davon wurden beim Erstellen der Benutzeroberfläche „halbautomatisch“ generiert, und die oben beschriebene Ansicht wurde für den Datenexportdienst implementiert.Serviceschnittstellen
Da das globale Modul von allen anderen Anwendungsmodulen verwendet wird, werden die Serviceschnittstellen darin deklariert, damit sie später über den DI-Mechanismus (Dependency Injection) in anderen Modulen verwendet werden können.
Darüber hinaus müssen Sie die Dienste in der
web-spring.xml
im
web-spring.xml
registrieren. Bei der Initialisierung des Kontexts erstellt CUBA Proxy-Klassen zum Serialisieren und Deserialisieren von Klassen bei der Interaktion mit Diensten im Core-Modul. Dies bietet lediglich eine separate Bereitstellung von Core- und Webmodulen, während der Entwickler keine zusätzlichen Anstrengungen unternehmen muss, sondern alles transparent erfolgt.
Also: Beim Erstellen von Entitätsklassen in CUBA wird dieselbe Zeit wie in Pure Spring aufgewendet (wenn Sie CUBA Studio nicht verwenden), Sie müssen jedoch keine Basisklassen zum Generieren von Primärschlüsseln erstellen. Außerdem müssen Sie keinen Code schreiben, um das Feld für die Entitätsversion, das logische Löschen und die Prüfung zu unterstützen. Meiner Meinung nach können Ansichten beim Debuggen von JPA-Joins und beim Bearbeiten von EAGER / LAZY-Samples ein wenig Zeit sparen.Kernmodul
Dieses Modul enthält die Implementierungen der im globalen Modul deklarierten Schnittstellen. Jeder Dienst in einer CUBA-Anwendung wird von
@Service
Anmerkungen
@Service
. Sie können andere Spring-Anmerkungen verwenden, müssen jedoch Folgendes berücksichtigen:
- Wenn der Dienst in anderen Modulen verfügbar sein soll, müssen Sie die Annotation
@Service
. - Es wird empfohlen, den Dienst zu benennen, um Doppelarbeit zu vermeiden, wenn in der Anwendung eine Komponente angezeigt wird, die dieselbe Schnittstelle implementiert.
- Die Datenerfassung erfolgt etwas anders als im Frühjahr, mehr dazu im nächsten Abschnitt.
Andernfalls ist das Core-Modul regulärer Spring-Code. Sie können Daten aus der Datenbank auswählen, Sie können externe Webdienste aufrufen und im Allgemeinen Code so schreiben, wie Sie es gewohnt sind.
Entity Manager und DataManager
Die CUBA-Plattform verwendet einen eigenen
EntityManager , der einen Teil der Aufrufe an den bekannten
javax.persistence.EntityManager
, diese Schnittstelle jedoch nicht implementiert. EntityManager bietet hauptsächlich Operationen auf niedriger Ebene und unterstützt das CUBA-Sicherheitsmodell nicht vollständig. Die Hauptklasse für die Arbeit mit Daten ist der
DataManager, der die folgenden Funktionen bietet:
- Zugriffskontrolle auf Zeilen- und Attributebene.
- Verwenden von Ansichten beim Abrufen von Daten.
- Dynamische Attribute.
Weitere Informationen zu DataManager und EntityManager finden Sie in der
Dokumentation . Es ist nicht erforderlich, explizit mit diesen Klassen zu arbeiten, um Daten in Benutzeroberflächenkomponenten (Tabellen usw.) auszuwählen. Die Datenquellen
(Datenquellen) werden in der GUI verwendet.
Wenn wir über PetClinic sprechen - es gibt fast keinen Code im Kernmodul, es gibt keine komplexe Geschäftslogik in dieser Anwendung.Zusätzliche Funktionen von Pet Clinic bis CUBA
Im vorherigen Abschnitt wurden zusätzliche Funktionen in der Referenzanwendung berücksichtigt. Da CUBA Spring verwendet, ist dieselbe Funktionalität auch bei der Entwicklung auf Basis dieser Plattform verfügbar, Sie müssen jedoch auf die Magie von Spring Boot verzichten. Darüber hinaus bietet CUBA ähnliche Out-of-Box-Funktionen.
Caching
Die CUBA-Plattform verfügt über einen Abfragecache und einen Entitätscache. Sie werden in der
Dokumentation ausführlich beschrieben und können als vorrangige Lösungen betrachtet werden, wenn Sie das Caching in der Anwendung verwenden möchten. Eingebettete Lösungen unterstützen die Bereitstellung und das Clustering verteilter Anwendungen. Natürlich können Sie die Annotation
@Cacheable
, wie in der
Spring-Dokumentation beschrieben , wenn das integrierte Caching für etwas nicht funktioniert.
Eingabeprüfung
CUBA verwendet
BeanValidation , um die eingegebenen Daten zu validieren. Wenn die integrierten Klassen nicht die erforderliche Funktionalität bieten, können Sie
Ihre eigene Überprüfungslogik schreiben. Darüber hinaus bietet CUBA
Validator
Klassen an, die hier beschrieben
werden .
Ausgabeformatierung
Die CUBA-Plattform bietet verschiedene
Formatierer für die Komponenten der Benutzeroberfläche. Sie können neben dem Standard auch
eigene Formatierer erstellen. Sie können die Annotation
@NamePattern
, um Entitätsinstanzen als Zeichenfolge darzustellen
i18n
CUBA unterstützt die
mehrsprachige Ausgabe mithilfe von
message.properties
Dateien, hier nichts Neues. Mit CUBA Studio können Sie solche Dateien schnell und einfach erstellen und bearbeiten.
Transaktionsmanagement
Folgende Arten der Transaktionsverwaltung werden unterstützt:
- Vertraut mit Spring Annotation
@Transactional
, Persistence
(und Klasse), wenn Sie ein Transaktionsmanagement auf niedriger Ebene benötigen.
Als ich Pet Clinic schrieb, brauchte ich Transaktionsmanagement nur an einer Stelle: Als ich ein Eingabeformular entwickelte, mit dem ich mehrere verwandte Entitäten auf einem Bildschirm bearbeiten konnte. Es war notwendig, die Besitzer und ihre Haustiere zu bearbeiten und Besuche in der Klinik hinzuzufügen. Es war notwendig, Daten sorgfältig zu speichern und auf anderen Bildschirmen zu aktualisieren.Tierklinik in wenigen Stunden. Wirklich
Ich habe in sechs Stunden eine Kopie von Pet Clinic mit der Standard-CUBA-Schnittstelle erstellt. Um nicht zu sagen, dass ich ein Experte für KUBA bin (ein paar Wochen sind vergangen, seit ich bei Haulmont angefangen habe), aber ich habe Erfahrung mit Spring und es hat mir sehr geholfen.
Werfen wir einen Blick auf die CUBA-Anwendung in Bezug auf die klassische Architektur:
Datenmodell - Entitätsklassen im globalen Modul. Das Erstellen eines Modells ist ein bekanntes und bekanntes Verfahren. Dank der BaseIntegerIdEntity-Klasse können Sie Zeit sparen, die normalerweise für das Generieren von IDs erforderlich ist.
Die Repository-Schicht wird nicht benötigt. Ich habe mehrere Ansichten erstellt, und das war's. Natürlich hat mir CUBA Studio ein wenig Zeit gespart, ich musste XML-Dateien nicht manuell schreiben.
Serviceschicht - Die Anwendung verfügt nur über zwei Services zum Exportieren von Daten nach JSON und XML. In der aktuellen Version der Spring Boot-Anwendung wurde diese Funktion übrigens entfernt. Obwohl es für JSON nicht funktioniert hat. In der CUBA-Version habe ich Schnittstellen im globalen Modul deklariert und die Implementierung in Core eingefügt. Nichts Neues außer dem DataManager, aber es dauerte sehr wenig Zeit, um es zu beherrschen.
Controller-Schicht - CUBA Pet Clinic verfügt nur über einen REST-Controller für den Export nach JSON und XML. Ich habe diesen Controller im Webmodul platziert. Auch hier nichts Besonderes, die Anmerkungen sind die gleichen, ein normaler Federregler.
Die Benutzeroberfläche - das Erstellen von Standard-CRUD-Formularen und sogar mit CUBA Studio - verursachte keine Schwierigkeiten. Keine Notwendigkeit, Code zu schreiben, um Daten an Komponenten zu übertragen, keine Datenanalyse aus dem Datenfilterungsformular, kein Aufwand mit Paginierung. Dafür gibt es Komponenten. Es dauerte einige Zeit, bis die Benutzeroberfläche so aussah wie in der Spring Boot-Version. Vaadin ist immer noch kein reines HTML, und es war schwieriger zu stylen.
Persönliche Erfahrungen haben tabellarisch aufgeführt:
Natürlich nutzt Pet Clinic nicht alle Funktionen von CUBA. Eine vollständige Liste der Plattformfunktionen finden Sie auf der
Website . Dort finden Sie auch Codebeispiele zur Lösung typischer Probleme, die bei der Entwicklung von Unternehmensanwendungen auftreten.
Meine persönliche Meinung ist, dass CUBA die Entwicklung der Serverseite der Anwendung vereinfacht und dazu beiträgt, noch mehr Zeit bei der Entwicklung der Benutzeroberfläche zu sparen, wenn Sie Standardbenutzerkomponenten und Stylingfunktionen verwenden. Aber selbst wenn Sie eine spezielle Benutzeroberfläche benötigen, wird aufgrund der Standard-Serverseite immer noch ein Zeitgewinn erzielt.Ein Plus! Gibt es irgendwelche Nachteile?
Natürlich gibt es keine perfekten Rahmenbedingungen. Sie sind nicht kritisch, aber als ich gerade anfing, mit CUBA zu arbeiten, gab es zunächst einige Beschwerden. Der
Wert von WTF / m war jedoch nicht unerschwinglich.
- Für die CUBA-Plattform gibt es eine IDE, die die anfängliche Erstellung eines Projekts vereinfacht. Der Wechsel zwischen Studio und IDEA ist zunächst etwas nervig. Die gute Nachricht ist, dass es eine Beta-Version von CLI gibt, Sie das Studio nicht ausführen müssen, um die Projektstruktur zu generieren, und außerdem wird die nächste Version von CUBA Studio ein Intellij IDEA-Plugin sein. Kein Umschalten mehr.
- CUBA verfügt über mehr XML-Dateien als die durchschnittliche Spring Boot-Anwendung. Dies liegt daran, dass die Kontextinitialisierung in CUBA auf eigene Weise erfolgt. Jetzt ist der Kampf um die Reduzierung der XML-Menge im Gange. Wir wenden uns nach Möglichkeit den Anmerkungen zu.
- Es gibt keine "lesbaren" URLs für Benutzeroberflächenformulare. Es ist möglich, über Links zu Bildschirmen auf Formulare zuzugreifen, diese sind jedoch nicht sehr benutzerfreundlich.
- Um mit Daten arbeiten zu können, müssen Sie den DataManager, die Ansichten und den EntityManager verwenden, nicht Spring JPA oder JDBC (diese APIs sind jedoch bei Bedarf auch verfügbar).
- CUBA funktioniert am besten mit relationalen Datenbanken als Data Warehouse. Für NoSQL müssen Sie Zugriffsbibliotheken für diese Repositorys verwenden und Ihre eigene Repository-Schicht schreiben. Dies ist jedoch meiner Meinung nach der gleiche Arbeitsaufwand wie bei der Entwicklung einer Anwendung ohne CUBA.
Insgesamt
Wenn es darum geht, eine Anwendung zu entwickeln, die eine relationale Datenbank als Data Warehouse verwendet und sich auf die Arbeit mit Daten in Tabellenform konzentriert, kann CUBA eine gute Wahl sein, weil:
- KUBA ist transparent. Quellcode ist verfügbar, jede Methode kann debuggt werden.
- CUBA ist erweiterbar (natürlich bis zu bekannten Grenzen). Sie können fast jede Dienstprogrammklasse erben und auf der Plattform ablegen, Ihre eigene REST-API erstellen und Ihr bevorzugtes Framework für die Benutzeroberfläche verwenden. CUBA wurde so erstellt , dass Sie Lösungen für jeden Kunden problemlos anpassen können. Es gibt einen guten Artikel über die Erweiterbarkeit der Plattform.
- KUBA ist Frühling. 80% Ihres Servercodes sind nur eine Spring-Anwendung.
- Schnellstart. Sie haben eine vollwertige Anwendung mit einem Admin-Bereich, nachdem Sie die erste Entität und einen Bildschirm für die Arbeit damit erstellt haben.
- Viele Routineaufgaben wurden bereits in der Plattform gelöst.
Mit CUBA können Sie also Zeit beim Schreiben eines monotonen "Service" -Codes sparen und sich auf das Schreiben von Code konzentrieren, um geschäftliche Probleme zu lösen. Und ja, wir bei Haulmont verwenden CUBA selbst, um sowohl verpackte als auch kundenspezifische Produkte zu entwickeln.