WebApps – RESTful mit Angular JS, JEE7, Java8, MySQL5 auf JBoss WildFly 9 und 10

Die Motivation

In dem bereits vorhandenen Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 wurde beschrieben, wie von einem Klassen-Diagramm (UML), genauer: Entity-Relationship-Diagramm hier, auch E-R Diagramm genannt, eine JEE7-Applikation erstellt werden kann. Diese JEE6- und JEE7-Beispielapplikationen hier liefern mit Hilfe von EJB 3-getriebenen Backends (Session Beans als DAOs, DAO-Pattern) unter Anbindung der JPA 2 Entities (Table-Per-Class-Pattern) mit Hilfe von DTOs über fachliche RESTful ServiceInterfaces oder per Microservices mit Docker, Spring Boot, siehe auch ServiceBroker-Pattern hier, die benötigten Daten zur Präsentation und Bearbeitung (Änderung, Löschen, Neuanlage) in den Web-Frontends, welche die WebServices konsumieren (ServiceConsumer-Pattern).

Eine dynamische Benutzeroberfläche, die sich an beliebige Auflösungen und Display-Größen responsiv anpasst, ist ebenfalls in der Beispiel-App enthalten, wie auch mit Hilfe des Angular JS Frameworks und des Bootstrap-Frameworks eine selbsterstellte Einkaufshilfe-Applikation (Einkaufsliste mit VK-Preisen) für einen simplen Einkaufszettel.

Die ausprogrammierte JEE7-Applikation shoppinghelper-angularjs mit dem Angular JS-Frontend und dem JEE-Backend mit den JPA 2 Entities kann einfach an verschiedene relationale Datenbanken (z. B. MySQL oder Postgres) angebunden werden, weshalb auch benötigte SQL-Export/-Import-Skripte zur Verfügung gestellt werden.

Die Beispiel-Applikation shoppinghelper-angularjs wird dann auf dem JBoss WildFly 10 Final Server (entspricht dem JBoss EAP 7-Server) und ebenfalls auf dem JBoss WildFly 9 deployt. Dies könnte jedoch problemlos auch auf einem WildFly 12 Server oder höher geschehen. Dabei ist die Verwendung dieser beiden JBoss WildFly JEE7-Application Server in einem Blog-Eintrag bereits beschrieben worden.

Erstellung der Beispiel Applikation auf dem Datenmodell

Mittels DBeaver wird das Klassendiagramm der Entities aus den Datenbank-Objekten erstellt und aus diesen, nach dem Anlegen der Datenbank per Hibernate Envers während dem WildFly 10 Undertow Deployment mittels JBoss Forge Eclipse PlugIn im JBoss Developer Studio erst der REST-WebService mit den Endpoints generiert und danach die Angular JS WebApp auf diesem RESTful WebService. Danach kann der ShoppingHelper ausprogrammiert werden.

E-R-diagram
(E-R-Diagramm der Beispiel-Datenbank „shoppinghelper“ ohne die MySQL-Sequence-Tabellen.)

Dabei darf positiv erwähnt werden, dass man mittels JBoss Forge eine saubere, stringente Architektur in die JEE7-Applikation einbringt, die beim Weiterentwickeln der App sehr hilfreich ist und sowohl die Entwicklungszeit-Performance als auch die Codequalität deutlich steigert. Ein großes Dankeschön an die JBoss Rockstars!

Bei dieser Gelegenheit darf auch das sehr effektive, interessante und erfolgreiche Seminar

“TDD mit Java”

von Binaris Informatik erwähnt werden.

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

Es werden in der pom.xml die folgenden Maven Dependencies verwendet:

WildFly JBoss Java EE 7 Specification APIs with Tools:
– jboss-javaee-7.0-with-tools
WildFly JBoss Java EE 7 Specification APIs with Resteasy:
– jboss-javaee-7.0-with-resteasy
WildFly JBoss Java EE 7 Specification APIs with Hibernate:
– jboss-javaee-7.0-with-hibernate

Weiterhin werden die folgenden JEE Dependencies (für das Servlet API, Annotationen, JAX-RS Implementierungen, JBoss RESTEasy, Jackson, Hibernate, JPA und EJB) verwendet:

– jboss-annotations-api_1.1_spec
– jboss-jaxrs-api_2.0_spec
– resteasy-jackson2-provider

– hibernate-jpa-2.1-api
– jboss-ejb-api_3.2_spec
– hibernate-jpamodelgen
– jboss-servlet-api_3.1_spec

Einsatz von CDI

Und ebenfalls die CDI 1.1 Dependency:

– cdi-api_1.1

Über CDI und JavaEE gibt es bereits Blog-Einträge in diesem Blog. Die Aktivierung von CDI erfolgt mittels beans.xml im WEB-INF Verzeichnis.

Auch über die Architektur und verwendeten Design Patterns der Beispiel-Applikationen gibt es bereits Informationen in diesem Blog bzw. bereits vorausgegangenen Blog-Einträgen.

JBoss WildFly Konfiguration der MySQL-Anbindung

Die Konfiguration des JBoss WildFly Application Servers 10 Final erfolgt analog der Konfigurationen der JBoss Application Server WildFly 8.1, 8.2 und 9 Final und betrifft die Datasource, die MySQL-Datenbank Inno DB 5.x, Hibernate 5, das Logging und den Connection Pool und ist, genau wie die Test-Frameworks und die Aktivierung der RESTful WebService-Schnittstelle in diesem Blog bereits beschrieben. Die Anbindung an die relationalen Datenbanken Postgres 9 und MySQL 5 ist in einem Blog-Eintrag bereits beschrieben.

Je nach verwendeter Datenbank kann in der persistence.xml im Deployment-Paket der Beispiel-App shoppinghelper-angularjs.war ein anderer Datenbank-Dialekt eingetragen werden:

Hier die /META-INF/persistence.xml der Beispiel-Applikation für MySQL5:

<xml version=“1.0″ encoding=“UTF-8″?>
<persistence version=“2.0″ xmlns=“http://java.sun.com/xml/ns/persistence“
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance“

xsi:schemaLocation=“http://java.sun.com/xml/ns/persistence

http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“>

   
<persistence-unit name=“ShoppinghelperPU“>

<provider>org.hibernate.ejb.HibernatePersistence</provider>

  <jta-data-source>

    java:jboss/datasources/ShoppinghelperDatasource
  </jta-data-source>

  <properties>

    <property name=“hibernate.hbm2ddl.auto“ value=“none“/>

    <property name=“hibernate.show_sql“ value=“false“/>

  </properties>

</persistence-unit>

</persistence>

Dafür wird je Datenbank die folgende Datasource benötigt und ist in
der standalone/configuration/standalone.xml des JBoss WildFly Servers unter den <datasources> einzutragen:

Für MySQL 5:

<datasource  jndi-name=“java:jboss/datasources/ShoppinghelperDatasource“
pool-name=“ShoppinghelperDS“
enabled=“true“>
<connection-url>jdbc:mysql://localhost:3306/shoppinghelper</connection-url>
<driver>mysql-connector-java-5.1.34.jar</driver>

<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>

<pool>
  <min-pool-size>10</min-pool-size>

  <max-pool-size>100</max-pool-size>

  <prefill>true</prefill>

</pool>

<security>
  <user-name>root</user-name>

  <password>das entsprechende Passwort</password>

</security>

<statement>
  <prepared-statement-cache-size>32</prepared-statement-cache-size>

  <share-prepared-statements>true</share-prepared-statements>

</statement>
   
</datasource>

Für die erfolgreiche Anbindung der soeben deklarierten Datasoures werden die Datenbank-Treiber auf Modul-Ebene des JBoss WildFly konfiguriert, wie in einem Blog-Eintrag bereits beschrieben.

Damit die Datasources die soeben konfigurierten Treiber auch finden, werden diese in der /standalone/configuration/standalone.xml bei den <datasources>deklariert:

Für MySQL 5:

<driver name=“mysql-connector-java-5.1.34.jar“
module=“com.mysql“>

<driver-class>com.mysql.jdbc.Driver</driver-class>
  
  <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource

  </xa-datasource-class>

</driver>

Hier auch der komplette MySQL-Export der Beispiel-Applikation shoppinghelper-angularjs:

Für MySQL 5: export_shoppinghelper_database_sql.txt

Die fertige Beispiel-Applikation shoppinghelper-angularjs
kann zusammen mit den anderen Beispiel-Applikationen hier betrachtet werden (MySQL5 Server auf Linux).

Hier das Beispiel-Projekte für die Eclipse-Entwicklungsumgebung JBoss Developer Studio:

shoppinghelper-angularjs

Hier der WildFly 10 Final als Zip-Archiv zum Download und Entpacken: Für Linux hier und für Windows hier. Voraussetzung ist jeweils Java 8.

Die fertig konfigurierte Version des WildFly 10 Final mit vielen Beispiel-Applikationen der vorigen Blog-Einträge hier zum Download bereit kann runtergeladen, entpackt und gestartet werden. Dabei ist nur der Pfad für JAVA_HOME in der standalone.xml anzupassen, wie in diesem Blog-Eintrag hier beschrieben wurde, damit dieser auf das tatsächliche JDK 8-Verzeichnis des Server-Systems zeigt und ebenfalls der Pfad für das log-Dateien Verzeichnis in der logging.properties. Die Angular JS Beispiel-Applikation dieses Blog-Eintrags kann danach selbst erneut deployt werden, ohne den bereits gestarteten WildFly 10 Application Server überhaupt stoppen oder erneut starten zu müssen.

Bei laufendem Server einfach ins Server-Unterverzeichnis /standalone/deployments das Archiv shoppinghelper-angularjs.war aus dem shoppinghelper-angularjs/target-Verzeichnis speichern

Sofort wird die Beispiel-Applikation deployt und in wenigen Sekunden gestartet und kann, falls der Default-Port fürs http-Protokoll nicht anders konfiguriert wurde, unter folgender Url aufgerufen werden:

http://localhost:8080/shoppinghelper-angularjs

Fazit: Wie man sieht, macht es einfach viel Freude, z.B. mittels JBoss Forge und JPA 2 Entities die responsiven Angular JS Apps auf dem Datenmodell zu erzeugen und weiterzuentwickeln oder eben robuste, komfortable, Browser-basierte Primefaces 6-Fontends, sei es nun für mobile IMS (Informations-Management-Systeme) oder für PIMS (Product Information Management Systems) und diese auf einem die JEE7-Spezifikation erfüllenden JBoss (EAP oder z. B. WildFly 9, WildFly 10) Server verfügbar zu machen. Somit besteht durchaus die Möglichkeit, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces 6, Angular JS und Bootstrap, sowie den die JEE7-Spezifikation implementierenden WebService-und Backend-Technologien folgen. Allen interessierten Leserinnen und Lesern weiterhin viel Freude bei der agilen Softwareentwicklung mittels Scrum und dem Test-Driven Development mit Java, sowie noch eine schöne Vorweihnachtszeit und ein schönes Weihnachtsfest.