Développement rapide d’application Web Java avec Spring ROO

Spring ROO est un outil proposé par la société SpringSource et par l’un de ses contributeurs, Ben Alex, à qui l’on doit notamment la solution Spring Security. Il s’agit d’un outil de productivité qui d’une part, permet la création rapide d’applications Web Java et d’autre part, simplifie le développement en s’occupant du code fastidieux.

Imaginez une situation classique pour n’importe quel développeur ou architecte : vous devez démarrer un nouveau projet. Pour cela, vous devez le créer, décider d’une base de données, d’un fournisseur de persistance, créer les objets du domaine, les contrôleurs associés, les vues, les tests, ajouter un contrôle de la sécurité et des accès, ajouter la gestion des logs… La liste ne se veut pas exhaustive mais demandez-vous combien cela vous prend de temps ? 2, 3 jours ? Une journée tout au mieux ? Une fois votre projet démarré, combien de temps perdez-vous à développer des assesseurs, des mutateurs, des méthodes toString() et autres joyeusetés du genre ?

C’est ici que ROO intervient car il s’agit d’un outil fullstack, c’est à dire qu’il couvre toutes les couches d’une application. La liste que je viens de citer dans l’exemple précédent n’est ni plus ni moins que le domaine d’action de cette solution qui s’articule aujourd’hui autour des solutions suivantes :

Dans cette article je vais créer une application “from scratch” utilisant Spring ROO. En particulier nous allons traiter les points suivant :

  • création d’un projet Spring ROO avec l’outils Spring Tool Suite
  • création et développement d’objets du domaine (entités JPA)
  • ajouter des champs de différents types aux objets du domaine
  • création de relations entre les différents objets du domaine
  • automatisation du lancement des tests d’intégration
  • création d’un workspace  pour importer le projet dans l’ IDE Eclipse
  • création de la partie Web
  • lancer  l’application dans un conteneur Web

1. Création d’un projet Spring ROO avec l’outils Spring Tool Suite

Il est temps de nous plonger dans le fonctionnement de ROO. Celui-ci effectue 2 types de traitements ; la génération de squelette d’application et la surveillance de projet avec modifications de code le cas échéant. Il est tout à fait possible d’utiliser ROO (via son terminal) avec votre EDI classique (voir même avec un éditeur de texte). Cependant, les projets créés étant largement basés sur l’ensemble Spring, je vous recommande de l’utiliser (toujours via son terminal) à l’intérieur de l’EDI SpringSource Tool Suite (STS, http://spring.io/tools). Il ne s’agit que d’une version d’Eclipse RCP optimisée pour fonctionner avec Spring et Maven.

Pour pouvoir observer ROO en action, il nous faut d’abord créer un projet de ce type.  Ouvrez donc STS et allez sur le menu File/New  puis sur Project… et enfin Spring pour sélectionner Spring Roo Project .

Cette action a pour effet d’ouvrir un assistant à la création d’un projet :

image

Bien que celui-ci comporte beaucoup de champs, il est très simple à utiliser (voyez ci-dessus une capture d’écran). Remplissez un nom de projet et un package de haut niveau (dans notre exemple com.springsource.roo.burgershop) puis cliquez sur Next.

On vous demande alors de confirmer la création du projet, cliquez sur Finish. Le projet est ensuite créé et vous pouvez l’observer dans le Package Explorer sur votre gauche. Il s’articule alors autour d’une structure standard Maven :

image

Vous pouvez observer que quelques fichiers de configuration basiques ont déjà été générés par ROO, notamment pour Log4j (log4j.properties), Maven (pom.xml) et Spring (applicationContext.xml). Un autre fichier important est log.roo qui va contenir toutes les commandes qui seront tapées dans le terminal. Cela va s’avérer très utile pour lancer rapidement un ensemble de ces dernières et donc accélérer encore plus la création.

Vous pouvez par ailleurs observer l’aspect du terminal ROO, en bas au centre :

 

Si celui-ci possède une apparence classique, son comportement l’est moins puisqu’il propose des réponses contextuelles, qui vous guident pas à pas. Quel que soit l’état d’avancement de votre projet, la commande hint vous permet de connaitre les actions possibles à l’instant présent. Voyons ce que cette commande nous donne maintenant, alors que nous n’avons fait que créer notre projet :

/ __ \/ __ \/ __ \
/ /_/ / / / / / / /
/ _, _/ /_/ / /_/ /
/_/ |_|\____/\____/    1.2.4.RELEASE [rev 75337cf]

Welcome to Spring Roo. For assistance press CTRL+SPACE or type "hint" then hit ENTER.
roo> hint
Roo requires the installation of a persistence configuration,
for example, JPA or MongoDB.

For JPA, type 'jpa setup' and then hit CTRL+SPACE three times.
We suggest you type 'H' then CTRL+SPACE to complete "HIBERNATE".
After the --provider, press CTRL+SPACE twice for database choices.
For testing purposes, type (or CTRL+SPACE) HYPERSONIC_IN_MEMORY.
If you press CTRL+SPACE again, you'll see there are no more options.
As such, you're ready to press ENTER to execute the command.

Once JPA is installed, type 'hint' and ENTER for the next suggestion.

Similarly, for MongoDB persistence, type 'mongo setup' and ENTER.
roo>

 

ROO vous indique qu’il est maintenant nécessaire d’ajouter une base de données et un fournisseur de persistance. En effet, les applications créées avec ROO sont domain driven, littéralement orientées métier. Cela signifie que l’on va d’abord créer les entités métiers avant d’ajouter les contrôleurs et vues associés. Ici, nous choisissons Hibernate comme fournisseur de persistance sur une base en mémoire (H2_IN_MEMORY), pour une question de rapidité bien entendu.

Rq: il est également possible de définir d’autre types de base de données comme Postgres, MySQL, Microsoft SQL Server, Oracle, DB2, Sybase, H2, Hypersonic.

Nous pouvons donc taper la commande correspondante dans le terminal sachant que pour cette dernière, l’auto-complétion est disponible (Ctrl + Space); inutile donc de vous rappeler de sa syntaxe complète ; ROO vous aide au maximum.

ROO continue ainsi son petit bonhomme de chemin en créant de nouveaux fichiers et en mettant à jour ceux existants dans notre arborescence :

image

2. Création et développement d’objets du domaine (entités JPA)

Pour les objets du domaine nous nous baserons sur le diagramme de classe suivant :

 

image

Maintenant il est temps de créer les objets du domaine et les champs qui sont associés à notre diagramme de classes. Pour commencer nous pouvons utiliser la commande entity jpa pour créer les objets du domaine. la commandande entity jpa a un nombre d’attributs optionnel que l’on retrouve à l’adresse :

http://docs.spring.io/spring-roo/reference/html/command-index.html#command-index-entity-jpa

Elle est composée par un attribut obligatoire qui est --class. En plus de l’attribut obligatoire nous utilisons --testAutomatically qui permet de créer des tests d’intégration pour le domain object. Commençons par l’objet du domaine Topping :

image

Et maintenant nous allons ajouter les champs  ‘name’ field à notre objet du domaine Topping avec la commande suivante :

image

Nous ferons de même avec les autres objets du domaine , avec les commandes suivantes :

entity jpa --class ~.domain.Base --testAutomatically 
field string --fieldName name --notNull --sizeMin 2
entity jpa --class ~.domain.Burger --testAutomatically 
field string --fieldName name --notNull --sizeMin 2
field number --fieldName price --type java.lang.Float

Nous allons maintenant créer les relation entre les objets. Pour créer une relation de type many-to-many entre Topping et Burger, nous allons exécuter la commande suivante :
~.domain.Burger roo> field set --fieldName toppings --type ~.domain.Topping

 

De façon similaire pour créer une relation m:1 (many to one) nous utiliserons la commande suivante :

 

~.domain.Burger roo> field reference --fieldName base --type ~.domain.Base

De manière similaire nous créerons un objet BurgerOrder avec les commandes suivantes :

entity jpa --class ~.domain.BurgerOrder --testAutomatically 
field string --fieldName name --notNull --sizeMin 2
field string --fieldName address --sizeMax 30
field number --fieldName total --type java.lang.Float 
field date --fieldName deliveryDate --type java.util.Date
field set --fieldName pizzas --type ~.domain.Burger

 

 

3. Test d’intégration

Il est encore possible de créer des tests avec la commande test integration .Une fois tout les tests créés il est possible de tous les lancer en utilisant la commande perform tests :

~.domain.PizzaOrder roo> perform tests
...
-------------------------------------------------------
 T E S T S
-------------------------------------------------------

Tests run: 36, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.860s
[INFO] Finished at: Tue Feb 14 18:01:45 EST 2012
[INFO] Final Memory: 6M/81M
[INFO] ------------------------------------------------------------------------

4. Création d’un workspace  pour importer le projet dans l’ IDE Eclipse

Par défaut ROO ne contient pas de workspace spécifique à un IDE. Pour rendre le workspace compatible avec un IDE il faut utiliser la commande suivante perform eclipse.

~.domain.PizzaOrder roo> perform eclipse
...
[INFO] Adding support for WTP version 2.0.
[INFO] Using Eclipse Workspace: null
[INFO] Adding default classpath container: org.eclipse.jdt.launching.JRE_CONTAINER
[INFO] Wrote settings to /Users/stewarta/projects/roo-test/pizzashop/.settings/org.eclipse.jdt.core.prefs
[INFO] Wrote Eclipse project for "pizzashop" to /Users/stewarta/projects/roo-test/pizzashop.
[INFO] n.PizzaOrder roo> 
       Javadoc for some artifacts is not available.
       Please run the same goal with the -DdownloadJavadocs=true parameter in order to check remote repositories for javadoc.
       List of artifacts without a javadoc archive:
         o org.springframework.roo:org.springframework.roo.annotations:1.2.1.RELEASE
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.685s
[INFO] Finished at: Tue Feb 14 18:04:20 EST 2012
[INFO] Final Memory: 7M/81M
[INFO] ------------------------------------------------------------------------

 

Si vous utilisez STS ou avait installé le plugin m2eclipse dans Eclipse, vous pouvez passer l’étape d’utilisation de cette commande perform eclipse . Dans ce cas il suffit simplement de faire  dans STS/Eclipse the ‘File > Import > General > Maven Projects’ dans le menu des options.

5. Création de la partie Web

Pour cette partie nous allons générer la partie web l’application Burger Shop. Cette action est accomplie par l’utilisation de la commande web mvc . La façon la plus simple de générer les controllers et tout les Web artifacts est d’utiliser la commande web mvc setup suivie par la commande web mvc all :

 

~.domain.BurgerOrder roo> web mvc setup

~.domain.BurgerOrder roo> web mvc all --package ~.web

 

Cette commande scannera  Burger Shop project pour toutes les entitées de domaine mettra en place un Spring MVC controller pour chaque entitées detectés.

 

6. lancer  l’application dans un conteneur Web

Pur déployer l’application dans un conteneur Web durant la phase de développement il existe plusieurs options disponibles:

  • Deployer à partir du shell /ligne de commande (sans besoin d’assembler le projet en une archive war):
    • lancer  ‘mvn tomcat:run’ sur la racine de votre projet (pas à l’intérieur du shell Roo ) pour deployer sur un  Tomcat
    • lancer ‘mvn jetty:run’ sur la racine du projet pour deployer sur un  Jetty
  • Deployer sur le serveur Web integré de STS:
    • Drag and drop votre project sur le serveur Web  désiré dans la  server view de STS
    • Clic droit sur le projet et sélectionner   ‘Run As > Run on Server’ pour déployer sur le serveur Web désiré
    • Après avoir déployé votre application sur le serveur avec la methode choisie votre application devrait être disponible à l’URL http://localhost:8080/burgershop
12 février 2014

2 responses on "Développement rapide d’application Web Java avec Spring ROO"

  1. How can I run the roo commands from java code not from shell ??? thanks

Leave a Message

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

© WayofCode. All rights reserved.

Setup Menus in Admin Panel