JPA Daten-UI Bindings für Vaadin

Die Erweiterung  der Übersetzungsphase durch einen Annotation-Processor eröffnet besonders für große Projekte neue Möglichkeiten. ‘Seife’ in der Version 1.8 unterstützt die direkte Anbindung von Benutzeroberflächen-Komponenten an Entities und andere Modellklassen. Unterstützt wird die automatische Erstellung der Bindings für Vaadin Forms und das Vaadin Grid.
Die Bindings können für jeden Datentyp angepasst werden, sei es für einen spezifische Modellklasse oder einen der Java-Basistypen. Das Beispiel zeigt ein ‘Customer’-Entity dessen Attribute im Formular oder als Liste dargestellt wird.

Beispiel herunterladen: VaadinSpringFields-1.8.0

Modell, UI-Code und Template werden transformiert
Funktionsprinzip Code-Templates mit Seife: Modell, UI-Code und Template werden transformiert

Die Anbindung des Grid wird direkt vom Datenmodell abgeleitet. Im Gegensatz zur herkömmlichen Art sind jedoch Code-Vorlagen für bestimmte Datentypen oder Datenstrukturen möglich die die am Entity festgelegten Constraints berücksichtigen. So wird das gleiche Template an allen Stellen genutzt.

@SeifeForm(forClass = Customer.class, generatorOptions = {"grid.gridClass"})
public class CustomerGrid extends Grid<Customer> {

    /**
     * Empfohlen wird die Felder gleich zu den Attributnamen des Entities zu
     * benennen. Die Felder werden dann implizit angebunden.
     */
    @SeifeBinding
    private Column<Customer> firstName;

    /**
     * Wenn nötig kann der Name explizit angegeben werden. Auch eine Punkt-
     * Notation zum Navigieren im Objektgraph ist möglich.
     */
    @SeifeBinding("lastName")
    private Column<Customer> name;
// [..]

Die Konversion des Boolean-Datentyps ist mit Vaadin-Bordmitteln nicht ohne zusätzlichen Code zu bewerkstelligen, dies wird vom Seife-Framework zur Übersetzungszeit automatisch übernommen:

    favoriteProductName = addColumn(entity -> Optional.ofNullable(entity.getFavoriteProduct()).map(p -> p.
      getName())
      .orElse(null));
    favoriteProductName.setKey(COLUMN_FAVORITE_PRODUCT_NAME);
    favoriteProductName.setId("favoriteProductName");
    premium = addComponentColumn(entity -> {
        Checkbox cb = new Checkbox(entity.isPremium());
        cb.setEnabled(false);
        return cb;
      });
    premium.setKey(COLUMN_PREMIUM);
    premium.setId("premium");

Es wird beispielsweise automatisch eine Checkbox für alle Spalten vom Typ Boolean von einer Code-Vorlage erstellt. Seife bringt einige dieser Vorlagen mit, sie können aber auch direkt im Projekt mit gepflegt werden und sind somit auch immer passend versioniert.

Gleiches ist für Formulare möglich.

Formular, das deklarativ an das Datenmodell angebunden wurde.

In einem solchen Eingabeformular werden zudem automatisch eindeutige IDs für die Controls erzeugt die für Integrationstests nutzbar sind.

Weitere Informationen in der Dokumentation (engl.): Documentation