Dans un premier temps je m'occupe tout d'abord de l'installation de Spring Initializr comme écrite sur le TP :
Une fois généré, téléchargé et dézippé au plus proche de la racine j'ouvre le projet avec IntelliJ.
On créer ensuite l'arborescence comme demandé dans le TP :
Pour être sûre que tout fonctionne, je créer une classe TestController pour tester la connectivité sur Postman et pouvoir continuer le TP :
package tp.example.store;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@GetMapping("/test")
public String test() {
return "test fonctionne";
}
}Je reprends la structure des TP de demo et j'ajoute dans build.gradle :
// Driver de MySQL
runtimeOnly 'com.mysql:mysql-connector-j'
// Starter Spring Data JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'Avant de configurer la connexion MySQL, je créer la database :
On configure ensuite la connexion MySQL en reprenant aussi les éléments des TP de demo. On ajoute ça dans application.properties :
spring.application.name=store
# Param bdd
spring.datasource.url=jdbc:mysql://localhost:3306/db_store?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=
# Recreer le schema
# Recréer les tables
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=trueNe pas oublier de rebuild gradle et dans project structure de mettre la version 17 :
package tp.example.store.bo;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Article {
// Génère un Id auto-increment de l'article
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
// Pour le titre de l'article
public String title;
}package tp.example.store.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import tp.example.store.bo.Article;
public interface ArticleRepository extends JpaRepository<Article, Long> {
}package tp.example.store.rest;
import org.springframework.web.bind.annotation.*;
import tp.example.store.bo.Article;
import tp.example.store.dao.ArticleRepository;
import java.util.List;
@RestController
public class ArticleRestController {
private ArticleRepository articleRepository;
public ArticleRestController(ArticleRepository articleRepository) {
this.articleRepository = articleRepository;
}
@GetMapping("/get-all-articles")
public List<Article> getAll() {
// Select all dans Article
List<Article> articles = this.articleRepository.findAll();
return articles;
}
@GetMapping("/trouve/{id}")
// renvoie l'article si trouvé sinon rien
public Article getId(@PathVariable Long id) {
return articleRepository.findById(id).orElse(null);
// On ne peut pas retirer le orElse sinon erreur ou mettre article en option - voir sur stackoverflow
// Marche aussi avec get()
}
@DeleteMapping("/supprimer/{id}")
// Sur Postman bien mettre le delete sinon ko code d'erreur
// Si l'article est supprimé renvoie true
public boolean delete(@PathVariable Long id) {
if (articleRepository.existsById(id)) {
articleRepository.deleteById(id);
return true;
}
// si n'existe pas renvoie false
return false;
}
@PostMapping("/article")
public String save(@RequestBody Article article) {
// si l'article existe déjà, il sauvegarde les modifs
if (articleRepository.existsById(article.id)) {
articleRepository.save(article);
return "Article sauvegardé";
}
// si l'article n'existe pas, il le crée, ne fonctionne pas et je ne trouve rien de plus sur internet
articleRepository.save(article);
return "Article créé";
}
}J'ajoute pour la partie 3 l'élément suivant :
// Utilisé sur ArticleService (partie 3 du tp)
public Long getId() {
return id;
}package tp.example.store.rest;
// On se mets sur la structure du cours 5 (standardiser les réponses)
public class ApiResponse<T> {
public String code;
public String message;
public T data;
public ApiResponse(String code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
}package tp.example.store.service;
import org.springframework.stereotype.Service;
import tp.example.store.bo.Article;
import tp.example.store.dao.ArticleRepository;
import tp.example.store.rest.ApiResponse;
import java.util.List;
import java.util.Optional;
@Service
public class ArticleService {
// On reprend aussi la structure du cours 5 (logique métier dans le Service)
private final ArticleRepository articleRepository;
public ArticleService(ArticleRepository articleRepository) {
this.articleRepository = articleRepository;
}
// Prend tous les articles de la database
public ApiResponse<List<Article>> getAll() {
List<Article> articles = articleRepository.findAll();
return new ApiResponse<>(
"202",
"La liste des articles",
articles
);
}
// Sort l'article avec l'id correspondant
public ApiResponse<Article> getId(Long id) {
Optional<Article> article = articleRepository.findById(id);
if (article.isPresent()) {
return new ApiResponse<>(
"202",
"L'article trouvé",
article.get()
);
}
return new ApiResponse<>(
"703",
"Data null",
null
);
}
// Supprime l'article avec l'id correspondant
public ApiResponse<Void> delete(Long id) {
if (articleRepository.existsById(id)) {
articleRepository.deleteById(id);
return new ApiResponse<>(
"202",
"Article supprimé",
null
);
}
return new ApiResponse<>(
"703",
"Article introuvable",
null
);
}
// Met à jour l'article avec l'id correspondant
public ApiResponse<Article> save(Article article) {
// MAJ
if (articleRepository.existsById(article.getId())) {
Article updated = articleRepository.save(article);
return new ApiResponse<>(
"203",
"L'article modifié",
updated
);
}
// Création
Article created = articleRepository.save(article);
return new ApiResponse<>(
"202",
"L'article crée",
created
);
}
}package tp.example.store.rest;
import org.springframework.web.bind.annotation.*;
import tp.example.store.bo.Article;
import tp.example.store.service.ArticleService;
import java.util.List;
@RestController
// Pour la modification, on reprend la structure du cours pour appeler le service
public class ArticleRestController {
private final ArticleService articleService;
public ArticleRestController(ArticleService articleService) {
this.articleService = articleService;
}
@GetMapping("/get-all-articles")
public ApiResponse<List<Article>> getAll() {
return articleService.getAll();
}
@GetMapping("/articles/{id}")
public ApiResponse<Article> getId(@PathVariable Long id) {
return articleService.getId(id);
}
@DeleteMapping("/articles/{id}")
// Void permet de retourner null contrairement à List et à Article
public ApiResponse<Void> delete(@PathVariable Long id) {
return articleService.delete(id);
}
@PostMapping("/articles")
public ApiResponse<Article> save(@RequestBody Article article) {
return articleService.save(article);
}
}- En GET /get-all-articles
- En GET /articles/{id}
- En DELETE /articles/{id}
- En POST /articles