L’objectif de cette démonstration consiste à vous montrer la rapidité avec laquelle le métier de votre application peut être exposé de manière sécurisée à travers une interface web RESTfull.
Voici les fonctionnalités offertes par notre application :
Consultation / ajout / suppression d’actions.
Consultation / ajout / suppression de cotation d’actions.
Notre application sera basée sur les technologies suivantes :
Spring Data Jpa pour la persistence de nos entités métiers.
Spring WebMCV pour exposer nos entités métiers.
Spring Security pour gérer l’accès à ces ressources.
HSQLDB comme base de données mémoire embarquée.
La démonstration fera usage d’AngularJS au sein des pages HTML fournies par le service pour démontrer les intéractions RESTfull avec l’api que nous allons construire. Les explications concernant la partie cliente seront brèves puisque le workshop n’a pas pour but de présenter AngularJS.
Configuration du projet
Déclaration du starter parent Spring Boot dans notre pom.xml
Notre projet nécessite donc les modules Spring Boot suivants :
spring-boot-starter-data-jpa
spring-boot-starter-web
spring-boot-security
En complément, nous utiliserons une base de données HSQLDB embarquée en mémoire. Elle facilitera notre développement
Il n’y a qu’à les déclarer en dépendances au sein du pom.xml
Création de nos entités métiers
Stock.java
StockQuote.java
Implémentation de la persistance des entités.
Nous utiliserons Spring Data JPA pour gérer la persistance de ces entités. Ce workshop n’a pas pour but d’expliquer le fonctionnement de Spring Data JPA mais en voici la principale fonctionnalité. Spring Data JPA s’occupe d’implémenter automatiquement les Data Access Object (DAO) des entités JPA de notre projet. Ainsi, l’outil nous fournit les implémentations nécessaires pour réaliser des opérations CRUD sur nos entités sans avoir à coder quoi que ce soit. Pour ce faire, nous devons simplement déclarer une interface qui hérite de JPARepository typé avec notre entité JPA.
Déclaration de notre DAO pour gérer notre entité Stock :
Spring Data JPA, qui sera initialisé par Spring Boot, s’occupera de scanner notre package com.invivoo.springboot.securedrestapi pour y rechercher des interfaces héritant de JPARepository. Le framework construira ensuite l’implémentation de l’interface nécessaire pour réaliser les opérations CRUD basique. Cette implémentation sera donc disponible à notre application pour une injection par le conteneur Spring.
Dans le cadre de notre exemple, nous n’avons pas besoin de DAO pour StockQuote puisque cette dernière a été configurée pour être cascadée lors de la sauvegarde de notre entité Stock.
Implémentation de la couche Service
La couche service sert habituellement à la manipulation métier. Toute manipulation ou validation fonctionnelle doit normalement y être implémentée. Cette couche correspond au lien entre la couche contrôleur et celle de la persistance.
StockService.java
StockServiceImpl.java
Implémentation du controleur Spring MVC pour l’entité Stock
La classe StockEndpoint servira à déclarer les points d’accès de notre Web Service REST. Cette implémentation est très standard aux fonctionnalités classiques offertes par Spring Web MVC.
StockController.java
Fournir un petit jeu de données
Spring Boot s’occupe de configurer automatiquement la base de données embarquée HSQLDB. Pour l’instant, nous fournirons un fichier data.sql
dans le classpath ( ex : src/main/resources
) pour initialiser des données de tests. Le paramétrage par défaut d’un DataSource par Spring Boot s’occupera d’exécuter quelconque SQL présent dans ce fichier.
data.sql
Spring Boot initialisera une base de données vide, générera le schéma à l’aide HBM2DDL d’Hibernate puis exécutera data.sql
afin d’importer des données pour vos développement. Il faut toujours garder à l’esprit que cette fonctionnalité est configurable et désactivable à travers les options Spring Boot que nous verrons plus tard.
Implémentation de notre classe d’amorçage Spring Boot
SecuredRestApi.java
Client du webservice.
Le client du web service est un client AngularJS. J’ai construit une archive avec tous les fichiers nécessaires, qu’il suffit de déposer dans le répertoire src/main/resources/resources
(voir soures github).
Démarrage de l’application
Comme vu à la partie 1, vous n’avez qu’à lancer votre classe maincom.invivoo.springboot.securedrestapi.SecuredRestApi
. Spring boot s’occupera d’initialiser votre application et tous les beans auto configurables fournis par les modules starter que vous avez déclarés dans le pom.xml
. La base de données sera créée en mémoire et initialisée. spring-boot-starter-security
sécurisera par défaut toutes les ressources exposées à travers http://localhost/*
. Il est donc important de noter le mot de passe aléatoire généré par Spring Boot. Il sera visible dans vos logs de démarrage.
« ` 2016-03-19 12:39:10,085 [localhost-startStop-1] INFO o.s.b.a.s.AuthenticationManagerConfiguration –
Using default security password: 6ef3b623-0cb4-400b-853d-af7fbc8d93a9 «
Connexion à l’application
Vous pourrez par la suite accéder à l’application depuis http://localhost:8080/. La configuration par défaut vous permettra de vous connecter avec le compte user
. Le mot de passe étant celui que vous retrouverez dans les logs de démarrage.
Et ensuite ?
Spring Boot est magique. En quelques déclarations nous sommes lancés avec une application fonctionnelle. Malheureusement (ou heureusement), la magie n’est pas une caractéristique qui est recherchée en ingénierie logicielle. C’est pourquoi j’expliquerai prochainement le fonctionnement du mécanisme d’auto configuration de Spring qui donne vie à nos applications.