Introduction
Lors du premier keynotes de SpringOne Europe, Ben Alex a fait une démonstration d'un outil permettant de démarrer from scratch un nouveau projet: ROO. C'est un outil de génération de code basé sur les produits Spring, Maven et AspectJ.Nous allons créer une application web permettant de gérer une liste d'employés.
Premier contact
ROO n'étant qu'en version alpha 2, il n'est pas directement disponible à partir de la page de download de Spring. le bundle est disponible à l'adresse suivante: http://dist.springframework.org/milestone/ROO/spring-roo-1.0.0.A1.zipROO se présente sous la forme d'un shell:
Remarque: La commande exit permet de sortir du shell.
Création du projet
ROO ne crée pas le répertoire racine du projet, il faut donc le faire à la main:mkdir spring_roo
cd spring_rooLa commande suivante permet de créer le contenu du projet sous la forme d'un projet Maven:
create project -topLevelPackage net.techwatch.spring.roomvn eclipse:eclipseIl est également possible d'ajouter les logs par:
configure logging -level DEBUG
Avant la création des entités du model de données, il faut intégrer le support de JPA à notre application:install jpa -database HYPERSONIC_IN_MEMORY -provider HIBERNATEet créer les classes du domaine:
new persistent class jpa -name ~.domain.Employee
add field string -fieldName firstName -notNull
add field string -fieldName lastName -notNull
add field date jpa -fieldName birthDate -type java.util.Date
new persistent class jpa -name ~.domain.EmployeeList
add field string -fieldName name -notNull
add field string -fieldName comment -sizeMax 254
add field date jpa -fieldName date -type java.util.Date
add field set jpa -element Employee -fieldName employeeLa création d'un élément persistent se fait par la commande:
new persistent class jpa -name
Remarque: Le caractère ~ fait référence au package root de l'application.
Le type du champ fait partie de la commande, par contre, les contraintes sont considérées comme des options. L'utilisation d'un type date nécessite de spécifier l'implémentation à utiliser:
java.util.Date ou java.sql.Date.L'utilisation de l'option
-sizeMax est une utilisation de l'implémentation de la JSR 303 (Bean validation). A l'exécution, ROO utilise ses annotations pour vérifier les contraintes.Remarque: il est possible d'ajouter un champ dans n'importe quelle entité en utilisant l'option
-class de la ligne de commande.Exemple de code généré pour l'entité Employee:
@Entity
@RooEntity
@RooJavaBean
@RooToString
public class EmployeeList {
@NotNull
private String name;
@Size(max = 254)
private String comment;
@Temporal(TemporalType.TIMESTAMP)
private Date createDate;
@OneToMany(cascade = CascadeType.ALL)
private Set employee = new HashSet();
} L'annotation
RooToString ajoute une définition de la méthode toString. L'annotation RooJavaBean se charge d'implémenter les méthodes d'accès et RooEntity permet d'implémenter, entre autre, la validation des contraintes.Pour compléter l'application, il faut maintenant implémenter le modéle MVC d'une application web. ROO permet d'implémenter cette architecture en se basant sur Spring WebFlow et Spring MVC. Des composants Ajax, basés sur le framework Dojo, sont également intégrés aux pages JSP.
new controller automatic -name ~.web.EmployeeListController
new controller automatic -name ~.web.EmployeeController -formBackingObject ~.domain.EmployeeL'utilisation du paramétre
automatic permet de générer la totalité de la logique des controlleurs, sinon, son développement est à la charge du développeur.ROO, lors de la création des controlleurs, ajoute l'option
-formBackingObject avec une référence sur la dernière entité utilisé. Cette option permet de faire le lien avec l'entité JPA pour le stockage des données du formulaire.Exemple de code pour un controlleur:
@RooWebScaffold(automaticallyMaintainView = true, formBackingObject = Employee.class)
@RequestMapping("/employee/**")
@Controller
public class EmployeeController {
}L'annotation
RooWebScaffold permet de faire le mapping entre l'entité et la vue (un peu à la façon dont Grails fonctionne). RequestMapping permet d'établir la concordance entre les URLs et les controlleurs.Remarque: l'application utilise des URL Rest.
Il ne reste plus qu'à exécuter l'application: