Imprimer
Catégorie : R6.05 - Prog. Framework : Spring boot
Affichages : 908

Préambule

 

Ce premier TP consiste à utiliser les connaissances du 1er cours sur Spring Boot pour créer une API très simple, manipulant des données venant d'une BdD relationnelle de type H2. Cette base contient 2 tables qui devraient être normalement reliées par une relation one-to-many, grâce à une clef étrangère, mais qui dans ce TP seront reliées "à la main", dont avec des risques d'incohérence. Les TPs suivants consisteront à étoffer cette API et la base, afin d'utiliser un bon modèle relationnel.

 

1°/ Mise en place

La première étape est de créer le squelette du projet comme dans la démonstration n°2 du TD1, avec les dépendances nécessaires (Spring Web, JPA, H2).

Ensuite, il faut modifier le fichier application.properties afin d'utiliser une BdD de type H2 en mémoire, avec comme nom rpgbd. La base et les tables doivent être créées au lancement de l'application, et seront remplies grâce au fichier data.sql suivant :

INSERT INTO categories (name) VALUES
('helmet'), ('crown'), ('armor'), ('clothes'), ('weapon'),('lighter'), ('purse'),('potion'), ('spell'), ('food');
INSERT INTO rpgitems (name, id_category, price, effect) VALUES 
('conic helmet',1, 200.0, 'A+10'),
('great crown of apologia', 2, 200.0, 'A+20'),
('leather armor', 3, 100.0, 'A+10'),
('hauberk', 3, 500.0, 'A+40'),
('tuxedo', 4, 600.0, 'L+1'),
('unicorn cosplay',  4, 199.99, 'L+10'),
('dagger', 5 , 100.0, 'S+5'),
('long sword', 5 , 300.0, 'S+20'),
('torch', 6, 2.5, ''),
('leather purse', 7, 10.31, ''),
('protection potion', 8, 100.0, 'a+10'),
('fireball', 9, 1000.0, ''),
('ice cone', 9, 1000.0, ''),
('apple', 10, 1.1, 'l+1'),
('wine', 10, 9.75, 'l+2');

 

2°/ Cahier des charges

 

2.1°/ Les entités

Pour représenter les 2 tables utilisées dans ce TP, il faut créer deux classes d'entité nommés RpgItem et ItemCategory. La première classe doit être associée à la table nommée rpgitems et la seconde à la table categories.

Chacune de ces classes doit avoir un attribut représentant la clef primaire nommé id. Pour les autres attributs, leur nom et type peuvent être déduit de ce qu'il y a dans le fichier data.sql ci-dessus.

2.2°/ Les repository

Le TP nécessite de créer deux repository pour gérer chacune des tables, nommés ItemCategoryRepository et RpgItemRepository. Les deux héritent de JpaRepository mais seul le deuxième doit déclarer des méthodes supplémentaires pour :

2.3°/ Les services

Le TP nécessite de créer deux services, dont les classes sont nommées ItemCategoryService et RpgItemService

La première classe définit deux méthodes :

La deuxième classe définit six méthodes :

2.4°/ Les contrôleurs

Le TP nécessite de créer deux contrôleurs, dont les classes sont nommées ItemCategoryController et RpgItemController

La première classe doit définir 2 routes et leur méthode associée :

La deuxième classe doit définir 7 routes et leur méthode associée :

  1. /rpg/items, méthode GET : renvoie tous les items,
  2. /rpg/items/{category}, méthode GET : renvoie tous les items de la catégorie indiquée par le paramètre category (en chaîne de caractères, cf. services)
  3. /rpg/items/{category}?maxprice=value, méthode GET : renvoie tous les items de la catégorie indiquée par le paramètre de route category, et dont le prix est inférieur à la valeur donnée par le paramètre de requête maxprice.
  4. /rpg/items?like=pattern1,pattern2,..., méthode GET : renvoie tous les items dont le nom contient un des patterns donné par le paramètre like de la requête.
  5. /rpg/items/noeffect, méthode GET : renvoie tous les items sans effet
  6. /rpg/items, méthode POST : pour créer un nouvel item, sachant que le corps de la requête est un objet JSON contenant au minimum le nom, la catégorie et le prix de l'item. L'effet est optionnel. La réponse doit contenir le nouvel objet créé.
  7. /rpg/items/{id}, méthode PUT : pour mettre à jour item dont l'id est donné par le paramètre de route id. Le corps de la requête est un objet JSON contenant un (au minimum) ou plusieurs champ parmi nom, catégorie, prix et effet. Seuls les champs existants sont utilisés pour mettre à jour l'item, s'il existe.

Remarques :

 

 

 

3°/ Tester les routes

La façon la plus simple et la plus universelle consiste à utiliser Postman. Cela dit, pour les requête GET, un simple navigateur suffit.