LireJarp - DOAG

25
LireJarp Lightweight Rest Java Architecture Pattern Java Enterprise Anwendungen effizient und schnell entwickeln

Transcript of LireJarp - DOAG

Page 1: LireJarp - DOAG

LireJarp Lightweight Rest Java Architecture Pattern

Java Enterprise Anwendungen effizient und schnell entwickeln

Page 2: LireJarp - DOAG

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

Page 3: LireJarp - DOAG

● 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

Page 4: LireJarp - DOAG

Demo

Erklärung des Projektes

Zusammenfassung & Diskussion

16.11.2015 LireJarp 4

Fokus heute

Projekterstellung Erstellen des Domänenobjektes

Projektaufbau Projekterstellung & Generierung Standardfunktionalität

Page 5: LireJarp - DOAG

Demo Use Case

Als Besucher der DOAG möchte ich alle Veranstaltungen des heutigen Tages aufgelistet

bekommen.

Page 6: LireJarp - DOAG

16.11.2015 LireJarp 6

Projektaufbau

Page 7: LireJarp - DOAG

16.11.2015 LireJarp 7

Projektaufbau

● Tomee Maven Plugin

– Serverinstallation und –konfiguration

– Hinzufügen und Entfernen von Bibliotheken

Page 8: LireJarp - DOAG

16.11.2015 LireJarp 8

Projekterstellung

Page 9: LireJarp - DOAG

Projekterstellung

16.11.2015 LireJarp 9

Umbenennung

Page 10: LireJarp - DOAG

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

Page 11: LireJarp - DOAG

16.11.2015 LireJarp 11

Standardfunktionalität

Page 12: LireJarp - DOAG

LireJarp 12

Lösungsansatz „Generic Domain Pattern“

Page 13: LireJarp - DOAG

LireJarp 13

Entitäten und Services

Page 14: LireJarp - DOAG

Standardfunktionalität Generic Domain Pattern: Entitäten Services

16.11.2015 LireJarp 14

Page 15: LireJarp - DOAG

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

Page 16: LireJarp - DOAG

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

Page 17: LireJarp - DOAG

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

Page 18: LireJarp - DOAG

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

Page 19: LireJarp - DOAG

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

Page 20: LireJarp - DOAG

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

Page 21: LireJarp - DOAG

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

Page 22: LireJarp - DOAG

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:

Page 24: LireJarp - DOAG

Vielen Dank für Ihre Aufmerksamkeit!

Fragen?

Page 25: LireJarp - DOAG

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