
Pour cela, il va falloir:
- un Eclipse avec les plugins SpringSource,
- le SDK Spring ROO.
Le plus simple étant de télécharger la mouture d’Eclipse contenant le package SpringSource complet(Spring , Spring ROO, les serveurs etc…).
N’oubliez pas d’ajouter dans le path le chemin vers le répertoire bin de l’installation de Spring ROO, pour l’utiliser en ligne de commande.
Pour faire mes tests, je vais fabrique une webapp permettant de gérer des projets avec une liste de tâches dans celui-ci, et des semaines de réalisation de ces tâches par des utilisateurs, remplissant pour chaque jour de la semaine des tâches sur n’importe quel projet. Évidemment, l’application sera très simpliste, Spring ROO ne pouvant pas deviner les règles de gestion à implémenter…Le projet s’appellera « weekTaskManager »:

Création du projet sous Eclipse
Une fois un workspace créé et Eclipse démarré, il faut faire File > New > Other > Spring Source Tool Suite et Roo Project

Là, donnez un nom puis un package racine puis faire « Finish ».
La console Roo qui va être utilisée pour lancer les commandes pour créer les classes et les champs est dans une vue (sinon, Window > Show View >Spring Tool Suite > Roo Shell):

C’est avec des lignes de commande que tout le socle du projet va être créé.
Pour tester, la base Hypersonic sera utilisée. Il sera possible de la changer ultérieurement. C’est la première commande à lancer dans la console Roo:
roo>persistence setup –provider HIBERNATE –database HYPERSONIC_IN_MEMORY

Création du CRUD
- création des tâches, qui vont simplement contenir une description:
roo>entity –class ~.domain.Task –testAutomatically
~.domain.Task roo> field string –fieldName description –notNull –sizeMin 10
- création des utilisateurs, qui vont simplement avoir un nom:
~.domain.Task roo> entity –class ~.domain.AppliUser –testAutomatically
~.domain.AppliUser roo> field string –fieldName name –notNull –sizeMin 10
- création des tâches, qui contiennent une référence vers un user, une tâche et une temps passé sur celle-ci à une date donnée:
~.domain.AppliUser roo> entity –class ~.domain.TaskDate –testAutomatically
~.domain.TaskDate roo> field reference –fieldName appliUser –type ~.domain.AppliUser
~.domain.TaskDate roo> field reference –fieldName task –type ~.domain.Task
~.domain.TaskDate roo> field number –fieldName elapsedTime –type java.lang.Float
~.domain.TaskDate roo> field date –fieldName realeaseDate –type java.util.Date
- création des semaines qui vont être contenir une année, un numéro de semaine et une collection de dates:
~.domain.Week roo> field number –fieldName weekNumber –notNull –sizeMin 1 –sizeMax 2 –type java.lang.Integer
~.domain.Week roo> field number –fieldName weekYear –notNull –sizeMin 2 –sizeMax 4 –type java.lang.Integer
~.domain.Week roo> field set –fieldName weekTaskDates –element ~.domain.TaskDate
- pour finir, nos projets, qui vont avoir une description et une collection de tâches:
~.domain.Week roo> entity –class ~.domain.Project –testAutomatically
~.domain.Project roo> field string –fieldName description –notNull –sizeMin 10
~.domain.Project roo> field set –fieldName tasks –element ~.domain.Task
donc: « reference » pour un lien objet simple, avec « –type » pour le type d’objet et « set » pour une collection d’objets avec « –element ».
Il faut maintenant tester l’application:
~.domain.Project roo> perform tests
Si tout c’est bien passé, le test doit terminé par un « [INFO] BUILD SUCCESSFUL ». Chouette.
Création de l’interface WEB
Il est alors possible de rajouter la couche web (c’est là que c’est puissant). Simplement, en tapant la commande:
~.domain.Project roo> controller all –package ~.web
C’est fini!
Il suffit d’ajouter le projet à un serveur SpringSource(dans la vue server > SpringSource dm Server et faire clic droit et add/removes et ajouter le projet) puis le démarrer.
L’application est alors démarrée dans l’url http://localhost:8080/weekTaskManager/ et voilà!

L’internationalisation, la modification des css et autres, ce fait dans le répertoire WEB-INF.
Ajout de la sécurité
Pour cela, il faut utiliser la commande:
~.web roo> security setup
Pour que cela fonctionne et résoudre correctement les dépendances, j’ai du rejouer la commande:
~.web roo> perform eclipse
La sécurité permet de gérer les accès aux répertoires, l’accès aux views et ajouter une fenêtre de login (http://localhost:8080/weekTaskManager/login):

Le déploiement sur un serveur
Pour créer un war, il faut jouer la commande:
~.web roo> perform package
Conclusion
Afin de réaliser un CRUD propre, rapide, joli, basé sur des outils solides (SPRING, HIBERNATE), des tests automatisés, AJDT, une intégration à Eclipse très réussie etc… je pense que Spring ROO joue bien son rôle, d’autant plus que les commandes sont assez simples (et avec auto-complétion sous Eclipse) et puissantes (je ne peux pas tout présenter dans ce test, y faut que je dorme aussi…). Reste à savoir si retravailler le code est facile. A première vue, cela à l’air le cas, le projet étant organisé de façon carré et le code basé sur des standards. Il faut éviter de se tromper dans les commandes de création de champs et tout se passera bien one shoot!
Pour créer un socle de Webapp java super solide, je pense que c’est le top.
Effectivement, ça semble pas mal !
Par contre, ils pourraient faire un effort sur le plugin Eclipse et développer une GUI pour créer les objets et les champs.
Car franchement, connaitre les commandes par coeur c’est pas très user-friendly alors que les générer serait hyper facile.
Tu veux pas nous faire un plugin Eclipse là dessus adrien ?? 😉
a+
Merci Seb pour les astuces supplémentaires! N’hésite pas à mettre des commentaires/critiques sur les billets, ça ne peut que les enrichir.
Comment peut-on développer un projet spring roo avec une db existante.
Hello,
Spring ROO est intéressant pour du RAD mais nécessite un très grand travail en amont sur le modèle de données. La syntaxe étant assez complexe lors de la création des FK ou bien seulement, lors de la mise à jour du modèle.
Le bootstrapping est un grand point de ROO.
Pour ma part, nous somme passés sur MyEclipse For Spring qui est largement plus abouti d’une point de vue GUI et sur les possibilité de générer une webapp pour différent environnements (iphone, Google GWT ou Spring WebFlow). Bien évidemment, il y a toute la création du Bootstrapping, Scaffolding et CRUD de la Webapp. Un gros plus, vous pouvez créer vos propres templates de génération.
Bémol toutefois, MyEclipse for Spring est payant (99€), mais très vite amortie pour une société.
A+