Java Spring Boot
Java Spring Boot
Java Spring
Le socle technique des applications Java EE
Ce livre apporte les éléments clés pour se repérer dans les différentes technologies utilisées dans les
projets basés sur Spring. Il prend en compte les différences de configuration liées aux versions de
Java Spring
Spring (en version 4.3 et 5.2 au moment de l’écriture) et se base sur des exemples concrets d’utili-
sation. Il permet au lecteur d’être très rapidement autonome sur un projet d’entreprise qui utilise
Java Spring
souvent dans les projets (Ressources, Bindeurs, Validateurs, Convertisseurs et Tests). La program-
mation par aspects est expérimentée, les applications web Spring MVC et les Web Services sont
Le socle technique
détaillés avec les tests unitaires associés. L’auteur présente les nouveautés Spring Boot, Kotlin
avec Angular, les applications orientées messages et Spring Batch, une introduction à Reactor et
WebFlux et termine par une description de la partie Spring d’un projet généré à partir de JHipster
afin d’illustrer une mise en œuvre très actuelle.
Tout au long des chapitres, l’auteur s’appuie sur des exemples fonctionnels afin de permettre l’ex-
périmentation au plus tôt par le lecteur. Dans ce but, des éléments sont en téléchargement sur le site
[Link].
des applications Java EE
Hervé LE MORVAN est aujourd’hui consultant DevOps pour de grands comptes de la Banque, de l’Assurance
et des Telecoms. Durant ses vingt années d’expérience, il est principalement intervenu en tant que référent tech- 3e édition
nique et formateur dans des équipes de Recherches et Développement ou d’Architectes et en tant que support au
développement d’applications sur des missions de migration ou de modernisation de Systèmes d’Informations.
À ce titre, il est intervenu dans de nombreux projets de migrations utilisant le socle Spring et connaît parfaite-
ment les attentes des équipes dans ce domaine. C’est toute cette expérience qu’il partage volontiers tout au long
des pages de ce livre.
En téléchargement
Téléchargement
exemples
[Link]
.fr
Hervé LE MORVAN
Table des matières 1
Avant-propos
1. Préambule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3. Organisation du livre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4. Public visé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5. Pourquoi Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6. Prérequis pour aborder Spring et Java EE . . . . . . . . . . . . . . . . . . . . . . 29
7. Objectifs du livre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Chapitre 1
Éléments constitutifs du framework
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2. Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3. Utilité de Spring dans un projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4. Vue d'ensemble et sujets abordés dans l'ouvrage . . . . . . . . . . . . . . . . 41
4.1 Les modules Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.2 Sujets abordés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.3 Version des briques Spring utilisées dans l'ouvrage . . . . . . . . . . 43
4.4 Version des ressources externes . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.5 Gestion des dépendances Maven . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.6 Utilisation d'un BOM (Bill Of Materials) Maven. . . . . . . . . . . . 46
5. Compléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6. Points clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2 Java Spring
Le socle technique des applications Java EE
Chapitre 2
Spring et les design patterns
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2. Le singleton en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
2.1 Préoccupation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
2.2 Solution Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
2.3 Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3. L'inversion de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4. Façade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5. Fabrique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6. Active record . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7. Décorateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
8. Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
9. Modèle Vue Contrôleur (MVC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
10. Le contrôleur de partie frontale (Front Controller) . . . . . . . . . . . . . . 65
11. Les assistants de vue (View Helper) . . . . . . . . . . . . . . . . . . . . . . . . . . 66
12. Les templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
13. Stratégie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
14. Points clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Chapitre 3
Rappels sur les éléments externes à Spring
1. Codage equals et hashCode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
1.1 Description de la problématique . . . . . . . . . . . . . . . . . . . . . . . . . 74
1.2 Mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
2. Projet Lombok. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3. Les systèmes de log. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Table des matières 3
Chapitre 4
Le conteneur Spring
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
2. Les origines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
3. Les modules fondamentaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
3.1 Composition d’un bean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
3.2 Le singleton et le prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
3.3 Les objets fondamentaux du package core . . . . . . . . . . . . . . . . 102
3.3.1 Le PropertyEditor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
3.4 Les PropertyValues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
3.5 Le BranWrapper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
3.6 La BeanFactory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
3.7 L’interface BeanDefinition. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
3.8 Le PropertyPlaceholderConfigurer. . . . . . . . . . . . . . . . . . . . . . . 107
3.9 Les objets fondamentaux du package context . . . . . . . . . . . . . 109
3.10 Relations entre le Bean, sa BeanFactory ou son Contexte. . . . 110
4. Configuration des beans. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
4.1 Configuration par un fichier XML . . . . . . . . . . . . . . . . . . . . . . 112
4.2 Configuration avec des annotations . . . . . . . . . . . . . . . . . . . . . 113
4.3 Configurer les beans applicatifs implicitement . . . . . . . . . . . . 115
4.4 Configuration par lambdas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
5. Utilisation des beans : injection par setters et constructeurs . . . . . 117
5.1 Mapping via le constructeur en XML . . . . . . . . . . . . . . . . . . . . 118
5.2 Comparaison des méthodes d'instanciation . . . . . . . . . . . . . . . 119
5.3 Autres annotations de configuration . . . . . . . . . . . . . . . . . . . . 120
5.3.1 L’annotation @Primary . . . . . . . . . . . . . . . . . . . . . . . . . 120
5.3.2 L’annotation @Profile et @Conditionnal . . . . . . . . . . . 121
6. Contrôle du cycle de vie : construction et destruction . . . . . . . . . . 131
7. Exemple illustrant les mappings standards. . . . . . . . . . . . . . . . . . . . 132
7.1 Le projet Maven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
7.2 Fichier de configuration de Spring. . . . . . . . . . . . . . . . . . . . . . . 132
Table des matières 5
Chapitre 5
Configuration avancée
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
2. Les fichiers de ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
2.1 Les fichiers de ressources standards. . . . . . . . . . . . . . . . . . . . . . 164
2.2 Les fichiers de ressources chargés via le contexte Spring . . . . . 165
6 Java Spring
Le socle technique des applications Java EE
Chapitre 6
Programmation orientée aspect avec Spring
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
2. Pourquoi l’AOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
3. Les concepts d’AOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
4. Limites de Spring AOP et utilisation d’AspectJ . . . . . . . . . . . . . . . . 190
5. Le support @AspectJ dans Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
5.1 Activation du support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
5.2 Activation de @AspectJ avec configuration XML . . . . . . . . . . 191
5.3 Activation de @AspectJ avec configuration Java . . . . . . . . . . . 192
5.4 Déclaration d'un aspect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
5.5 Déclaration d'un pointcut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
5.6 Déclaration des greffons simples . . . . . . . . . . . . . . . . . . . . . . . . 195
5.7 Les types génériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
5.8 Détermination de noms d'arguments . . . . . . . . . . . . . . . . . . . . 198
5.9 Ordre d’appel des greffons interceptant le point de jonction . 198
5.10 Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
5.11 Le mécanisme des proxies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
5.12 La face cachée des proxies en AOP . . . . . . . . . . . . . . . . . . . . . . 200
6. Les API bas niveau pour Spring AOP. . . . . . . . . . . . . . . . . . . . . . . . . 203
6.1 L’interface PointCut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
6.2 L’interface ClassFilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
6.3 L’interface MethodMatcher . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
7. Points clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
8 Java Spring
Le socle technique des applications Java EE
Chapitre 7
Les tests et Spring
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
2. Les mock objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
2.1 Mocks spécialisés pour "environnement" . . . . . . . . . . . . . . . . . 207
2.2 Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
2.2.1 Utilités générales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
2.2.2 Spring MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
2.3 Tests d'intégration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
2.3.1 Vue d'ensemble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
2.3.2 Mise en cache du contexte de test . . . . . . . . . . . . . . . . . 209
2.3.3 Tests back et front . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
2.4 Annotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
2.4.1 @ContextConfiguration . . . . . . . . . . . . . . . . . . . . . . . . 211
2.4.2 @WebAppConfiguration . . . . . . . . . . . . . . . . . . . . . . . . 212
2.4.3 @ContextHierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
2.4.4 @ActiveProfiles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
2.4.5 @TestPropertySource. . . . . . . . . . . . . . . . . . . . . . . . . . . 213
2.4.6 @DirtiesContext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
2.4.7 Interface TestExecutionListener . . . . . . . . . . . . . . . . . . 215
2.4.8 @TransactionConfiguration . . . . . . . . . . . . . . . . . . . . . 216
2.4.9 @Transactional. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
2.4.10 @Rollback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
2.4.11 @BeforeTransaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
2.4.12 @AfterTransaction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
2.4.13 @Sql, @SqlConfig et @SqlGroup . . . . . . . . . . . . . . . . . 217
2.5 Annotations standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
3. Les frameworks de test JUnit et testNG. . . . . . . . . . . . . . . . . . . . . . 219
3.1 Utilisation avec JUnit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
3.1.1 Spring JUnit Runner . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
3.1.2 @IfProfileValue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
3.1.3 @ProfileValueSourceConfiguration . . . . . . . . . . . . . . . 220
Table des matières 9
Chapitre 8
Partie back de l’application
1. Description de la problématique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
2. Mise en œuvre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
2.1 Configuration d’une entité de la couche domaine . . . . . . . . . . 284
2.2 Accès à l'objet du domaine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
2.3 Requêtes typées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
2.4 Cache de niveaux 1 et 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
2.5 Bean Validation (JSR-303) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
2.6 L'API Criteria. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
2.7 Accès à la base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
2.8 Le fichier [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
2.9 Tests JPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
3. Points clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Chapitre 9
Spring dans un contexte web JSP
1. Spring MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
1.1 Fonctionnement global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
1.1.1 Configuration simple XML . . . . . . . . . . . . . . . . . . . . . . 298
1.1.2 Configuration par annotation . . . . . . . . . . . . . . . . . . . . 302
1.2 Éléments complexes du contrôleur . . . . . . . . . . . . . . . . . . . . . . 303
1.2.1 Fonctionnement global du contrôleur . . . . . . . . . . . . . . 303
1.2.2 Exemple de la classe Simple . . . . . . . . . . . . . . . . . . . . . . 304
1.2.3 Simple revisité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
1.2.4 Par le path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
1.2.5 Par un motif sur le path . . . . . . . . . . . . . . . . . . . . . . . . . 306
1.2.6 Par le path et une méthode. . . . . . . . . . . . . . . . . . . . . . . 307
1.2.7 Mappé par path + méthode +
présence de paramètres de query . . . . . . . . . . . . . . . . . . 307
1.2.8 Mappé par path + méthode + présence d’un header. . 308
12 Java Spring
Le socle technique des applications Java EE
Chapitre 10
Intégration JSF2
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
2. Mojarra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
3. Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
4. Cycle de vie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
4.1 Requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
4.2 Restore View ou Reconstruct Component Tree . . . . . . . . . . . 360
4.3 Apply Request Value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
4.4 Perform Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
4.5 Synchronize Model ou Update Model Values . . . . . . . . . . . . . 361
4.6 Invoke Application Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
4.7 Render Response. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
4.8 Réponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
4.9 Fichier [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
4.10 Dépendances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
4.11 Fichier [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
4.12 Bean managé sans Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
4.13 Exemple de vue JSF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
4.14 Aperçu d’un composant JSF. . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
5. Intégration Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
5.1 Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
5.2 Dépendances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
5.3 Fichier [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
5.4 Fichier [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
5.5 Couches basses (back) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
6. Points clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Table des matières 15
Chapitre 11
Application Spring Angular
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
2. La partie backend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
2.1 Génération d’un backend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
3. La partie frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
3.1 Angular CLI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
3.2 Création du projet initial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
3.3 Démarrage de l’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
3.4 Créer un service Compte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
4. Points clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Chapitre 12
Spring-HATEOAS
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
1.1 Exemple de liens hypermédias codés manuellement . . . . . . . . 384
1.2 Aller plus loin avec l’hypermédia. . . . . . . . . . . . . . . . . . . . . . . . 386
1.3 Autoconfiguration par annotation . . . . . . . . . . . . . . . . . . . . . . 387
1.4 Fournisseurs de relations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
1.5 Fournisseur d’URI compacte . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
1.6 Support du côté client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
1.7 Découverte de liens coté client . . . . . . . . . . . . . . . . . . . . . . . . . 390
1.8 Utilisation du @RepositoryRestResource . . . . . . . . . . . . . . . . 390
2. Points clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
16 Java Spring
Le socle technique des applications Java EE
Chapitre 13
Documentation Spring REST Docs
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
1.1 Dépendance sur la bibliothèque de tests. . . . . . . . . . . . . . . . . . 404
1.2 Dépendance sur les plug-ins Maven . . . . . . . . . . . . . . . . . . . . . 404
1.3 Les extraits (snippets) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
2. Exemple JUnit 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
3. Requête et réponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
4. Réponse avec un JSON imbriqué . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
4.1 Les paramètres de requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
4.2 Les paramètres inclus dans le path . . . . . . . . . . . . . . . . . . . . . . 410
4.3 Les Request parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
4.4 Les Request parts payloads . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
4.5 Les champs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
4.6 Liens hypermédias dans la réponse . . . . . . . . . . . . . . . . . . . . . . 411
4.7 Les en-têtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
5. Personnalisation de la documentation . . . . . . . . . . . . . . . . . . . . . . . 413
5.1 Utilisation de @AutoConfigureRestDocs . . . . . . . . . . . . . . . . 413
6. Couplage Swagger 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
6.1 Utilisation Springfox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
6.2 En dehors de Spring Boot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
7. Utilisation avec Spring Data Rest . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
8. Récapitulatif sur la documentation générée . . . . . . . . . . . . . . . . . . . 417
9. Points clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Table des matières 17
Chapitre 14
Spring Boot
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
2. Configuration des exemples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
2.1 Configuration Maven pour la version 1.5 de Spring Boot . . . . 420
2.2 Configuration Maven pour la version 2 de Spring Boot . . . . . 421
2.3 Utilisation du hot swapping . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
2.4 Packaging et lancement de l’application . . . . . . . . . . . . . . . . . . 422
2.5 Application Spring MVC minimum . . . . . . . . . . . . . . . . . . . . . 422
3. L’auto-configuration Spring Boot . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
3.1 La configuration automatique des Beans Spring . . . . . . . . . . . 423
4. Les starters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
4.1 Les starters courants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
4.2 Les starters orientés messages . . . . . . . . . . . . . . . . . . . . . . . . . . 428
4.3 Les bases de données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
4.4 Les web services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
4.5 Les moteurs de rendus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
4.6 Les starters moins courants . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
5. Spring MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
6. Personnalisation de la bannière . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
7. Événements d’applications. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
8. La récupération des arguments de la ligne de commande . . . . . . . . 433
8.1 CommandLineRunner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
8.2 ApplicationRunner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
8.3 La configuration yaml et profiles. . . . . . . . . . . . . . . . . . . . . . . . 434
9. La configuration des logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
9.1 Les logs en couleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
9.2 Choix du type de logs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
10. L’auto-configuration pour Spring MVC . . . . . . . . . . . . . . . . . . . . . . 440
11. La gestion des sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
18 Java Spring
Le socle technique des applications Java EE
Chapitre 15
Spring et le noSQL
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
2. Les modèles de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
2.1 Modèle Clé-valeur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
2.2 Modèle Documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
2.3 Modèle Orienté colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
2.4 Les bases orientées Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
3. Principes des bases de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
3.1 Consistance des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
4. Pourquoi et quand utiliser une base noSQL . . . . . . . . . . . . . . . . . . . 453
5. Problèmes liés à l’utilisation des bases NoSQL . . . . . . . . . . . . . . . . . 455
6. Limitations des bases de données noSQL . . . . . . . . . . . . . . . . . . . . . 456
7. Spring et le noSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
8. Cache de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
8.1 Cache simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
9. Cacher des données avec GemFire. . . . . . . . . . . . . . . . . . . . . . . . . . . 460
10. GemFire en tant que base de données noSQL . . . . . . . . . . . . . . . . . 462
Table des matières 19
Chapitre 16
Spring Batch
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
2. Architecture d’un batch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
3. Exemple Spring Batch version 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
4. Chargeur H2 depuis un CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
5. Dépendances Spring Batch 3 et 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
6. Autres nouveautés de la version 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
7. Points clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Chapitre 17
Les intergiciels à messages (MOM)
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
2. Implémentations open source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
3. Implémentations propriétaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
4. Les cas d’utilisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
5. JMS et ActiveMQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
5.1 Utilisation simplifiée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
20 Java Spring
Le socle technique des applications Java EE
6. RabbitMQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
6.1 Spring AMQP et RabbitMQ . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
6.2 Exemple RabbitMQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
7. Points clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
Chapitre 18
Spring et Kotlin
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
2. Caractéristiques principales du langage Kotlin. . . . . . . . . . . . . . . . . 511
2.1 Les méthodes et les fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . 511
2.2 L’immutabilité des objets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
2.3 Les types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
2.4 La gestion des valeurs nulles . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
2.5 Les appels chaînés sécurisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
2.6 Les lambdas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
3. Contrôleur Spring MVC, Spring Boot en Kotlin . . . . . . . . . . . . . . . 517
3.1 Fonction principale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
3.2 Test associé à la fonction principale . . . . . . . . . . . . . . . . . . . . . 518
4. Les plug-ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
5. Points clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Chapitre 19
Introduction à Spring Reactor et Spring Webflux
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
2. Spring Reactor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
2.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
2.2 Utilisation de Reactor Core . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
2.2.1 Les threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
2.2.2 Les FutureTask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
2.2.3 Le CompletableFuture . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Table des matières 21
Chapitre 20
Spring et JHipster
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
2. Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
2.1 JHipster web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
2.2 Personnalisation de l’outil JHispter . . . . . . . . . . . . . . . . . . . . . . 570
2.3 Niveaux de personnalisations . . . . . . . . . . . . . . . . . . . . . . . . . . 571
3. Créer un blueprint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
3.1 Blueprint pour utiliser lombok dans le domain . . . . . . . . . . . . 577
3.2 Exécution du blueprint local . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
22 Java Spring
Le socle technique des applications Java EE
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
Chapitre 7
Les tests et Spring
1. Introduction
Les tests et Spring
Les préoccupations centrées sur les tests sont fondamentales dans les
développements d’aujourd’hui. Le TDD (Test-Driven Development ou en
français développement piloté par les tests), qui consiste, lors de l'écriture de
nos programmes, à écrire les tests unitaires avant d'écrire le code source d'un
logiciel, est de plus en plus utilisé. Depuis quelques temps nous utilisons aussi
des BDD (Behavior Driven Development) qui sont une évolution du TDD avec
lequel on décrit les tests via des phrases qui sont ensuite utilisées avec un
framework comme Cucumber.
Spring propose des API qui nous simplifient la mise en œuvre des tests
unitaires (TU) et des tests d’intégration (TI). Il faut tester tout ce qui vaut le
coup d’être testé. Si vous rencontrez des problèmes lors de la rédaction des TU
et TI, c’est qu’il faut retravailler (refactoriser) votre code. Une bonne pratique
consiste à écrire le test en même temps que la classe testée et même parfois à
coder les tests avant l’implémentation des méthodes testées de façon à ce que
l'architecture de l'application soit compatible avec les tests. Les tests unitaires
sont des tests rapides qui permettent de valider des actions de bas niveau. Les
tests d'intégration utilisent des jeux d'essais pour valider du code de plus haut
niveau. Il existe aussi des tests qui simulent un utilisateur. Ces tests sont faits
avec des outils comme Selenium.
206 Java Spring
Le socle technique des applications Java EE
Classe Mock
Environnement MockEnvironment
@PropertySource MockPropertySource
2.2 Support
}
[Link](person, "id", new
Long(99), [Link]);
assertEquals("id", 99L, [Link]());
Il est ainsi possible d'intervenir sur des variables ou des méthodes qui ne sont
normalement pas disponibles.
Nous chercherons juste à émuler la base pour la partie back et le serveur web
pour la partie front. Nous utiliserons aussi parfois, pour des programmes qui
exploitent des fichiers, des extraits de ces fichiers afin de ne tester que les cas
fonctionnels passants et non passants.
Bases de données
Pour les bases de données, nous pouvons utiliser les classes Spring ou un
framework tiers comme DBUnit ou Liquibase.
Remarque
Nous ne montrerons que les exemples en SQL intégrés au framework de Spring
mais nous vous invitons à approfondir le sujet en étudiant les possibilités des
autres frameworks.
Pour les projets simples, n’utilisant pas de librairie d’ORM comme Hibernate
et JPA et pour lequel le modèle de données est petit, nous pouvons utiliser le
package [Link] qui contient la classe
2.4 Annotations
2.4.1 @ContextConfiguration
L’annotation principale est @ContextConfiguration. Elle permet de
charger le contexte de tests de multiples façons. Nous spécifions
l’emplacement des fichiers de configuration ainsi que les classes annotées
@Configuration qui portent la configuration :
@ContextConfiguration("/[Link]")
public class XmlApplicationContextTests {
// Contenu de la classe...
@ContextConfiguration(classes = [Link])
public class ConfigClassApplicationContextTests {
// Contenu de la classe...