Spring et JHipster
Introduction
JHipster, créé en 2014 par Julien Dubois, est un générateur d’applications full stack open source qui combine efficacement Spring Boot pour le backend et les Single Page Applications (SPA) pour le frontend, soutenu par des outils comme Yeoman, Maven, et Gradle. Reconnu pour sa capacité à évoluer rapidement grâce au soutien d’une large communauté de plus de 600 contributeurs, JHipster se distingue par sa personnalisation aisée, permettant aux développeurs de créer des applications sur mesure via des templates modifiables. Avec plus de 168 000 téléchargements mensuels et l’usage dans plus de 300 entreprises, cet outil favorise un démarrage accéléré des projets technologiquement complexes, offrant un avantage stratégique pour l’exploration de nouvelles technologies sans nécessiter de partir de zéro. JHipster intègre la génération du backend, de la base de données, et du frontend avec des technologies comme Angular, React, ou Vue, tout en supportant la préparation d’environnements cloud et dockérisés, avec une couverture complète des tests. Disponible tant en ligne de commande qu’en version web simplifiée, JHipster encourage l’adoption de bonnes pratiques dans le développement d’applications modernes, facilitant ainsi la création rapide d’applications tout en promouvant l’efficacité et la modularité dans le développement de solutions DevOps orientées Spring.
1. JHipster web
Voici un exemple simple avec la version en ligne disponible à l’adresse : https://start.jhipster.tech/
Cette version est gratuite et open source. Il est tout à fait possible de la modifier pour la rendre disponible aux développeurs d’une société en personnalisant les modèles.
Il faut tout d’abord s’enregistrer, afin d’être dirigé sur la page principale.
La génération du projet s’effectue en deux étapes :
-
génération d’un squelette applicatif vide ;
-
ajout des entités métier.
Nous pouvons demander à l’outil d’héberger les fichiers source générés sur GitHub ou...
Créer un blueprint
La documentation officielle est ici : https://www.jhipster.tech/modules/creating-a-blueprint
Un blueprint JHipster est un générateur Yeoman qui est composé à partir d’un sous-générateur JHipster spécifique pour étendre les fonctionnalités de ce dernier. Le blueprint peut remplacer tout getter défini du sous-générateur et fournir ses propres modèles et fonctionnalités. Les blueprints JHipster sont répertoriés sur le marketplace JHipster (https://www.jhipster.tech/modules/marketplace/#/list...
JHipster comme outil multi-technologies
L’outil JHipster est un très bon outil pour essayer des technologies et voir comment elles s’articulent entre elles. Il essaie d’en montrer l’état de l’art et les bonnes pratiques, JHipster supporte de nombreux frameworks et de nombreuses technologies.
Dans sa version 8, il gère les technologies suivantes.
1. Côté client
Côté client |
Fonctionnalités |
HTML5 |
HTML5 est la dernière révision majeure du HTML (format de données conçu pour représenter les pages web). |
CSS3 |
Feuilles de style en cascade version 3. |
BootStrap |
Collection d’outils pour la création du design de sites et d’applications web. |
TypeScript |
Langage de programmation qui améliore et sécurise la production de code JavaScript. |
Angular |
Angular est un framework JavaScript qui permet de développer des pages web. |
React |
React est une bibliothèque JavaScript pour faciliter la création d’application web monopage, via la création de composants dépendant d’un état et générant une page (ou portion) HTML à chaque changement d’état. |
Vue |
Framework JavaScript pour la création d’interfaces utilisateurs. |
Redux |
Redux est un conteneur d’état prédictible pour les applications JavaScript. |
WebSocket |
WebSocket est un protocole réseau web basé sur des canaux de communication full-duplex par-dessus une connexion TCP. |
npm |
npm (Node Package Manager) est un gestionnaire de paquets JavaScript largement utilisé pour l’installation, la gestion et la distribution de bibliothèques et de modules JavaScript. |
Webpack |
Webpack récupère des dépendances et des modules JavaScript entre autres pour générer des fichiers statiques. |
SASS |
SASS (Syntactically Awesome Stylesheets) est un langage de génération de feuilles de style. |
Browsersync |
Browsersync synchronise les URL, les interactions et les changements de code dans un navigateur sur plusieurs appareils. |
Jest |
Jest est un framework de test JavaScript populaire qui permet aux développeurs de créer et d’exécuter des tests unitaires et d’intégration pour leurs applications JavaScript et React. |
Cypress |
Cypress est un framework de test end-to-end pour les applications... |
Structure du projet
Nous allons illustrer l’architecture des applications générées avec JHipster via l’étude d’un cas de génération d’application simple Angular/Spring Boot.
1. La partie front
La partie front peut utiliser par exemple Angular. Elle est « responsive », c’est-à-dire que l’affichage se réorganise si nous changeons la taille de la zone d’affichage du navigateur web. Il s’agit d’une Single Page Application, c’est-à-dire qu’il n’y a qu’une page qui se met à jour par AJAX. L’application générée utilise HTML5 Boilerplate (https://html5boilerplate.com/) et Twitter Bootstrap (http://getbootstrap.com). Des tests sont générés pour Karma.
Pour le développement de la partie front, JHipster utilise Yeoman avec Angular, React ou Vue.
Ce générateur permet d’utiliser en fait tous les meilleurs frameworks clients disponibles actuellement.
2. Les grandes lignes de la partie back
Nous ne présentons ici que les grandes lignes de la partie back.
Nous utilisons pour cet exemple une application monolithe avec une base SQL H2 et un front Angular.
La partie front Angular n’est pas présentée, car elle sort du cadre de cet ouvrage. Le lecteur pourra s’appuyer sur le livre Angular - Développez vos applications...
Applications générées
1. Spring Boot
Le générateur JHipster profite de la possibilité de générer directement une application Spring Boot préconfigurée. Il est très facile de changer la configuration pour être dans une stack Spring classique dans le cas où vous ne pourriez pas utiliser Spring Boot. Pour ce faire, le plus simple est de regarder le pom.xml effectif déduit par votre outil de développement préféré et de refaire le lanceur.
Spring Boot permet donc de créer rapidement une application fonctionnelle. La configuration est simplifiée.
a. Système de gestion des dépendances
Il est possible de générer les fichiers de configuration du build pour Maven et Gradle. Nous ne verrons que les aspects de la génération de projets basés sur Maven. JHipster utilise les profils pour personnaliser les éléments externes comme la base de données pour avoir des valeurs spécifiques en développement et en production.
b. Utilisation de Spring Security
L’intégration de Spring Security est très bien faite, ce qui nous permettra d’étudier des exemples concrets.
c. Spring MVC REST + Jackson
Nous profiterons de cette utilisation pour introduire ce sujet que nous n’avions pas traité auparavant. Nous utiliserons Swagger pour...
Étude des sources générées
1. Dépendances Maven
L’application utilise les dépendances Maven principales suivantes :
Dépendance |
Version |
tech.jhipster:jhipster-framework |
8.1.0 |
org.springframework.boot:spring-boot-configuration-processor |
3.2.0 |
org.springframework.boot:spring-boot-loader-tools |
3.2.0 |
org.springframework.boot:spring-boot-starter-actuator |
3.2.0 |
org.springframework.boot:spring-boot-starter-cache |
3.2.0 |
org.springframework.boot:spring-boot-starter-data-jpa |
3.2.0 |
org.springframework.boot:spring-boot-starter-logging |
3.2.0 |
org.springframework.boot:spring-boot-starter-mail |
3.2.0 |
org.springframework.boot:spring-boot-starter-oauth2-resource-server |
3.2.0 |
org.springframework.boot:spring-boot-starter-security |
3.2.0 |
org.springframework.boot:spring-boot-starter-test |
3.2.0 |
org.springframework.boot:spring-boot-starter-thymeleaf |
3.2.0 |
org.springframework.boot:spring-boot-starter-undertow |
3.2.0 |
org.springframework.boot:spring-boot-starter-web |
3.2.0 |
org.springframework.boot:spring-boot-test |
3.2.0 |
org.springframework.security:spring-security-data |
6.2.0 |
org.springframework.security:spring-security-test |
6.2.0 |
org.springdoc:springdoc-openapi-starter-webmvc-api |
2.3.0 |
com.fasterxml.jackson.datatype:jackson-datatype-hibernate6 |
2.15.3 |
com.fasterxml.jackson.datatype:jackson-datatype-hppc |
2.15.3 |
com.fasterxml.jackson.datatype:jackson-datatype-jsr310 |
2.15.3 |
com.fasterxml.jackson.module:jackson-module-jaxb-annotations |
2.15.3 |
com.tngtech.archunit:archunit-junit5-api |
1.2.1 |
com.tngtech.archunit:archunit-junit5-engine |
1.2.1 |
com.zaxxer:HikariCP |
5.0.1 |
io.dropwizard.metrics:metrics-core |
4.2.22 |
io.micrometer:micrometer-registry-prometheus |
1.12.0 |
jakarta.annotation:jakarta.annotation-api |
2.1.1 |
javax.cache:cache-api |
1.1.1 |
org.apache.commons:commons-lang3 |
3.13.0 |
org.ehcache:ehcache (classifier: jakarta) |
3.10.8 |
org.hibernate.orm:hibernate-core |
6.3.1.Final |
org.hibernate.orm:hibernate-jcache |
6.3.1.Final |
org.hibernate.orm:hibernate-jpamodelgen |
6.3.1.Final |
org.hibernate.validator:hibernate-validator |
8.0.1.Final |
org.liquibase:liquibase-core |
4.24.0 |
org.mapstruct:mapstruct |
1.5.5.Final |
org.mapstruct:mapstruct-processor |
1.5.5.Final |
org.testcontainers:jdbc |
1.19.3 |
org.testcontainers:mysql |
1.19.3 |
2. Configuration de l’application
L’application est basée sur une configuration entièrement en Java avec les annotations.
Toute la configuration se trouve dans le package com.mycompany.myapp .config et ses sous-packages....
JHipster et WebFlux
WebFlux a été intégré dans JHipster 6 et amélioré dans JHipster 7.
Cet ajout était très attendu par les utilisateurs. Il est déjà très complet et permet les expérimentations.
Au niveau des bases de données, il nous propose :
-
SQL (H2, MySQL, PostgreSQL, MSSQL) ;
-
MongoDB ;
-
Cassandra ;
-
[BETA] Couchbase ;
-
[BETA] Neo4j ;
-
No database.
Si on choisit SQL, il propose alors en utilisant R2DBC :
-
H2 ;
-
PostgreSQL ;
-
MySQL ;
-
MariaDB ;
-
Microsoft SQL Server.
Les couches domain, service, web sont conformes aux spécifications que nous avons vu dans le chapitre sur WebFlux.
Le fait d’avoir une application réactive change un peu certaines classes de configuration.
1. Configuration DatabaseConfiguration
Pour les bases SQL, jHipster utilise R2DBC avec l’annotation @EnableR2dbc Repositories dans la classe DatabaseConfiguration.
Nous avons des convertisseurs pour les dates :
@Configuration
@EnableR2dbcRepositories({ "com.mycompany.myapp.repository" })
@EnableTransactionManagement
public class DatabaseConfiguration {
private final Logger log = LoggerFactory.getLogger(
DatabaseConfiguration.class);
private final Environment env;
public DatabaseConfiguration(Environment env) {
this.env = env;
}
/**
* Open the TCP port for the H2 database, so it is available
* remotely.
*
* @return the H2 database TCP server.
* @throws SQLException if the server failed to start.
*/
@Bean(initMethod = "start", destroyMethod = "stop")
@Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)
public Object h2TCPServer() throws SQLException {
String port = getValidPortForH2();
log.debug("H2 database is available on port {}", port);
return H2ConfigurationHelper.createServer(port);
}
private String getValidPortForH2()...
Points clés
Points à retenir :
-
JHipster génère une application Spring propre qui peut servir de modèle et propose un bon support de l’hypermédia et de HATEOAS.
-
JHipster permet de tester et de comparer différentes options de générations.
-
JHipster est très bien pour découvrir les technologies du moment.
-
Nous pouvons facilement personnaliser le code généré par JHipster.