View
12
Download
0
Category
Preview:
Citation preview
LireJarp Lightweight Rest Java Architecture Pattern
Java Enterprise Anwendungen effizient und schnell entwickeln
16.11.2015 LireJarp 2
Über mich Anett Hübner
Diplom Medieninformatikerin (TU-Dresden) Senior Softwareentwickler Hönigsberg & Düvel, Wolfsburg
seit 8 Jahren Architektur und Entwicklung von Java Enterprise Anwendungen
Referenzen Vodafone, Deutsche Post AG, BMW, VW
Carsten Büsse Webdesign Nixdorf Safety Systems GmbH Technischer Leiter
Markus Zarbock Korrektur, Ideen, AD-Anbindung, AngularJS Konzern IT, Volkswagen AG
Besten Dank für die Unterstützung
● Ziel 1: Produktivität beim erstellen, entwickeln, betreiben und warten von Softwareprojekten steigern
● Ziel 2: Effektives Einbinden des Webdesigners in die Softwareentwicklung
Kleine individuelle Anwendungen mit standardisierter Architektur
statt monolithischer Systeme oder Insellösungen
Viele Einzelanwendungen Monolith
16.11.2015 LireJarp 3
Motivation
Demo
Erklärung des Projektes
Zusammenfassung & Diskussion
16.11.2015 LireJarp 4
Fokus heute
Projekterstellung Erstellen des Domänenobjektes
Projektaufbau Projekterstellung & Generierung Standardfunktionalität
Demo Use Case
Als Besucher der DOAG möchte ich alle Veranstaltungen des heutigen Tages aufgelistet
bekommen.
16.11.2015 LireJarp 6
Projektaufbau
16.11.2015 LireJarp 7
Projektaufbau
● Tomee Maven Plugin
– Serverinstallation und –konfiguration
– Hinzufügen und Entfernen von Bibliotheken
16.11.2015 LireJarp 8
Projekterstellung
Projekterstellung
16.11.2015 LireJarp 9
Umbenennung
package de.starwit.${appName?lower_case}.ejb.impl; import javax.ejb.Stateless; import de.starwit.${appName?lower_case}.ejb.${domain}Service; import de.starwit.${appName?lower_case}.entity.${domain}Entity; @Stateless(name = "${domain}Service") public class ${domain}ServiceImpl extends AbstractServiceImpl<${domain}Entity> implements ${domain}Service { private static final long serialVersionUID = 1L; }
Projekterstellung
16.11.2015 LireJarp 10
Codegenerierung
16.11.2015 LireJarp 11
Standardfunktionalität
LireJarp 12
Lösungsansatz „Generic Domain Pattern“
LireJarp 13
Entitäten und Services
Standardfunktionalität Generic Domain Pattern: Entitäten Services
16.11.2015 LireJarp 14
16.11.2015 LireJarp 15
Entitäten als Domainobjekte
@XmlRootElement @Entity @Table(name = „PRESENATION") public class PresentationEntity extends AbstractEntity { @NotBlank @Size(max = 30) private String title; private Date presentationdate; private String description; private List<PublicationEntity> publications; @XmlTransient @OneToMany(mappedBy=„presentation", cascade={CascadeType.ALL}) public List<PublicationsEntity> getPublications() { return news; }
Parsen nach JSON für Restful Webservices
Annotationen für die Datenbank via JPA
Annotationen für Validierung via BeanValidation
Ausschluss vom Parsen
Definiert Verhalten bei CRUD-Operationen
Standardfunktionalität Entitäten als Domänenobjekte
16.11.2015 LireJarp 16
public class AbstractServiceImpl<E extends AbstractEntity> implements AbstractService<E> { ... public E create(E entity) { ... } public void delete(Long id) throws EntityNotFoundException { ... } public E update(E entity) throws ValidationException { ... } public List<E> findAll() { Class<E> clazz = getParentClass(); CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); CriteriaQuery<E> criteria = cb.createQuery(clazz); Root<E> r = criteria.from(getParentClass()); criteria.select(r); TypedQuery<E> query = getEntityManager().createQuery(criteria); return query.getResultList(); }
Standardfunktionalität Services für Businesslogik: Abstrakte Serviceklasse
16.11.2015 LireJarp 17
@Stateless(name = „PresentationService") public class PresentationServiceImpl extends AbstractServiceImpl<PresentationEntity> implements PresentationService { private static final long serialVersionUID = 1L; public PresentationEntity findByTitle(String title) { String sql = "select presentation from PresentationEntity presentation where presentation.title = :title"; TypedQuery<PresentationEntity> query = getEntityManager().createQuery(sql, PresentationEntity.class); query.setParameter(„title", title); return query.getSingleResult(); } } Konkrete Implementierung des Services für die Entität „Presentation“:
Die konkrete Implementation besitzt neben der Standardfunktionen noch eine weitere Funktion „findByTitle (String)“
Standardfunktionalität Services für Business Logik: Konkrete Implementierung
Standardfunktionalität
16.11.2015 LireJarp 18
@Path("/presentation") @Consumes("application/json") @Produces("application/json") public class PresentationRest extends AbstractRest<PresentationEntity> { @Inject private PresentationService service; @Override protected PresentationService getService() {return service;} @Path("/create") @PUT @Override public EntityResponse<PresentationEntity> create(PresentationEntity entity) { return super.createGeneric(entity); } @Path("/update") @POST @Override public EntityResponse<PresentationEntity> update(PresentationEntity entity) { return super.updateGeneric(entity); }
Restful Webservice für Presentation: findById, findAll und delete sind bereits in der abstrakten Klasse implementiert.
RESTful Webservices als Schnittstelle
16.11.2015 LireJarp 19
● Ant-Script zum kopieren der Frontenddateien in die laufende Anwendung
● Single Page Anwendung mit folgenden Bestandteilen:
– Website (index.html)
– pro Domänenobjekt
● Javascript: Controller, Routing & Konfiguration
● HTML: Views Übersicht & Detailseite zum Bearbeiten und Anzeigen
– Service als Konnektoren für RESTful Webservices pro Domänenobjekt
Standardfunktionalität AngularJS & HTML Frontend
16.11.2015 LireJarp 20
Ziel 1:
● Produktivität beim Erstellen, Entwickeln, Betreiben und Warten von Softwareprojekten steigern
Umsetzung
● Codegenerierung mit Freemarker als einfache Templateengine – Entities, EJB-Services, Testklassen und RESTful Webservices und GUI
● Codestrukturen und Namenskonventionen erhöhen die Codequalität und senken den Wartungsaufwand
● Einmalige Implementierung wiederkehrender Funktionalitäten (CRUD) über Generic Domain Pattern
Zusammenfassung Ziele & Umsetzung
16.11.2015 LireJarp 21
Ziel 2:
● Effektives Einbinden des Webdesigners in die Softwareentwicklung
Umsetzung
● Trennung von Oberfläche und Backendfunktionalität: – Oberfläche: AngluarJS und HTML – Schnittstelle: RESTful Webservices – Datenbankzugriff: Entitäten und Enterprise Java Beans
● Kopieren der Frontenddateien in die laufende Anwendung
Zusammenfassung Ziele & Umsetzung
16.11.2015 LireJarp 22
Viele Einzelanwendungen Monolith
Kleine individuelle Anwendungen mit standardisierter Architektur
statt monolithischer Systeme oder Insellösungen
● Verbesserung des AngularJS Frontends
● Authorisierung, Infrastruktur
● Project Build als Webanwendung
● Weitere Testautomatisierung (RESTful Services, Oberflächentests)
Zusammenfassung
Für die Zukunft:
16.11.2015 LireJarp 23
Impressum
● Quellcode: https://github.com/witchpou/lirejarp
● Blog: http://softengart.blogspot.de/2014/03/generic-jee-architecture.html
● E-Mail: Anett_Huebner@gmx.de, Anett.Huebner@hud.de
Vielen Dank für Ihre Aufmerksamkeit!
Fragen?
Bereich Verwendete Technologien
Oberfläche HTML
AngularJS 1.2.5
Validierung BeanValidation
Rest API JAX-RS 2.0 Implementierung: Apache CXT
JSON-Parser: Jackson 2.2.3
Business Services EJB 3.2 (Implementierung Open EJB)
Automatische Tests Arquillian 1.1.2
Arquillian Suite Extension 1.0.6
Arquillian Tomee Embedded 1.0.0
Datenbank (OR-Mapping) JPA 2.1
Hibernate 4.2
2H / MySQL
Buildtool und Deployment Maven 3.3.3
Tomee 7
Verwendete Technologien
16.11.2015 LireJarp 25
Recommended