26 août 2016

Développement RAD avec Spring Boot - Partie 2

Deliver & Run

Grow

Together

26 août 2016

Développement RAD avec Spring Boot - Partie 2

Deliver & Run

Grow

Together

26 août 2016

Développement RAD avec Spring Boot - Partie 2

Deliver & Run

Grow

Together

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

<!-- Inherit defaults from Spring Boot -->

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

package com.invivoo.springboot.securedrestapi.endpoint;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.invivoo.springboot.securedrestapi.entity.Stock;
import com.invivoo.springboot.securedrestapi.service.StockService;
@Controller
@RequestMapping(value = { "/", "/stock" }, produces = MediaType.APPLICATION_JSON_VALUE)
public class StockEndpoint {
@Resource
private StockService stockService;
/**
* Service qui retourne au format JSON l'intégralité des actions présentes
* en base.
*
* Url : GET /stock
*
* @return
*/
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody List findAll() {
return stockService.findAll();
}
/**
* Fournit la redirection vers la page HTML
* src/main/resources/resources/stocks.html.
*
* Url : GET /stock
*
* @return
*/
@RequestMapping(method = RequestMethod.GET, produces = MediaType.TEXT_HTML_VALUE)
public String getStocksPage() {
return "stocks.html";
}
/**
* Service qui retourne au format JSON l'action en fonction de l'identifiant
* fourni.
*
* Url : GET /stock/1
*
* @param id
* @return
*/
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public @ResponseBody Stock findOne(@PathVariable long id) {
return stockService.findOne(id);
}
/*

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-securitysé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.