Spring Boot est le framework le plus utilisé pour créer des API web en Java. Il s’appuie sur Spring Framework et apporte deux choses essentielles : une configuration automatique (il devine la configuration à partir des dépendances présentes) et un serveur web embarqué (Tomcat par défaut). Résultat : une API se lance avec un simple main, sans installer de serveur.
Ce cours utilise Spring Boot 4.1 (Spring Framework 7) avec Java 25, la version LTS actuelle de Java.
Générer le projet
Le site officiel Spring Initializr (start.spring.io), aussi intégré à IntelliJ IDEA et VS Code, génère le squelette. Il propose par défaut Gradle et Java 17 : choisissez Maven, Java 25, un groupe (fr.boutique) et la dépendance Spring Web. En ligne de commande :
curl https://start.spring.io/starter.zip -d type=maven-project -d dependencies=web -d javaVersion=25 \
-d groupId=fr.boutique -d artifactId=boutique -d packageName=fr.boutique -d baseDir=boutique -o boutique.zip
unzip boutique.zip
Structure obtenue :
boutique/
├── pom.xml # dépendances (spring-boot-starter-webmvc...)
├── mvnw # Maven Wrapper : pas besoin d'installer Maven
└── src/
├── main/java/fr/boutique/BoutiqueApplication.java
├── main/resources/application.properties
└── test/java/fr/boutique/BoutiqueApplicationTests.java
Les starters (spring-boot-starter-webmvc, -validation, -data-jpa…) regroupent des dépendances cohérentes dont Spring Boot gère les versions. La dépendance « Spring Web » correspond au starter spring-boot-starter-webmvc (nouveau nom depuis Spring Boot 4) ; Spring Initializr ajoute aussi son starter de test, spring-boot-starter-webmvc-test, car chaque module a désormais le sien.
La classe principale
package fr.boutique;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // auto-configuration + scan des composants de fr.boutique.*
public class BoutiqueApplication {
public static void main(String[] args) {
SpringApplication.run(BoutiqueApplication.class, args);
}
}
Spring scanne le package de cette classe et ses sous-packages : placez vos contrôleurs dans fr.boutique.produit, par exemple, jamais dans un package « à côté ».
Un premier contrôleur REST
package fr.boutique.produit;
import org.springframework.web.bind.annotation.*;
import java.util.List;
record ProduitDto(long id, String nom, double prix) {}
@RestController // les valeurs renvoyées deviennent le corps de la réponse
@RequestMapping("/api") // préfixe commun aux routes de la classe
class BonjourController {
@GetMapping("/bonjour") // GET /api/bonjour
String bonjour() {
return "Bonjour depuis Spring Boot";
}
@GetMapping("/produits") // GET /api/produits
List<ProduitDto> produits() {
return List.of(new ProduitDto(1, "Clavier", 45.5),
new ProduitDto(2, "Écran", 180));
}
}
@RestController combine @Controller et @ResponseBody. La bibliothèque Jackson, incluse dans le starter webmvc (Jackson 3 depuis Spring Boot 4, packages tools.jackson.*), convertit automatiquement le record en JSON : [{"id":1,"nom":"Clavier","prix":45.5}, ...]. Les records sont parfaits pour cela : immuables, concis, sérialisés sans configuration.
Lancer et tester
./mvnw spring-boot:run # démarre sur le port 8080
curl http://localhost:8080/api/produits
Pour changer le port, ajoutez dans application.properties :
server.port=8081
spring.application.name=boutique
Les journaux de démarrage indiquent Tomcat started on port 8081. Si le port est déjà occupé, l’application refuse de démarrer : arrêtez l’ancienne instance ou changez de port.
À retenir
- Spring Boot = Spring + auto-configuration + serveur embarqué.
- Une méthode d’un
@RestControllerannotée@GetMappingdevient un endpoint. - Les objets renvoyés sont sérialisés en JSON par Jackson.
Exercices
Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.
Générer et lancer votre première API
Dans votre environnement de travail, générez un projet Spring Boot 4 (Maven, Java 25, dépendance Spring Web), par exemple avec
curl https://start.spring.io/starter.zip -d type=maven-project -d dependencies=web -d javaVersion=25 -d groupId=fr.boutique -d artifactId=boutique -d packageName=fr.boutique -d baseDir=boutique -o boutique.zippuisunzip boutique.zip && cd boutique(sanstype=maven-project, Spring Initializr génère un projet Gradle, sanspom.xmlnimvnw). Créez un@RestControllerexposantGET /api/bonjourqui renvoie un recordMessage(String texte)etGET /api/produitsqui renvoie une liste de trois produits. Lancez l’application avec./mvnw spring-boot:runet appelez les deux endpoints aveccurl.- L'application démarre et les journaux affichent « Tomcat started on port 8080 »
- curl http://localhost:8080/api/bonjour renvoie un objet JSON {"texte": ...}
- curl http://localhost:8080/api/produits renvoie un tableau JSON de trois produits
- Le contrôleur est dans un sous-package de la classe @SpringBootApplication
Sérialiser un record en JSON comme Jackson
Pour comprendre ce que fait Jackson, écrivez
static String toJson(Produit p)pour le recordProduit(long id, String nom, double prix, boolean disponible). Le format est compact, dans l’ordre des composants :{"id":1,"nom":"Clavier","prix":45.5,"disponible":true}Les chaînes sont entre guillemets et les caractères
\et"qu’elles contiennent sont échappés (précédés d’un\). Chaque ligne de l’entrée estid;nom;prix;disponible; affichez le JSON de chaque produit.import java.util.*; public class Main { static String echapper(String s) { // TODO : échapper \ puis " return s; } static String toJson(Produit p) { // TODO return ""; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextLine()) { String l = sc.nextLine(); if (l.isBlank()) continue; String[] c = l.split(";"); Produit p = new Produit(Long.parseLong(c[0]), c[1], Double.parseDouble(c[2]), Boolean.parseBoolean(c[3])); System.out.println(toJson(p)); } } } record Produit(long id, String nom, double prix, boolean disponible) {}@RestController
Quelle est la différence entre
@RestControlleret@Controller?- @RestController ajoute @ResponseBody : la valeur renvoyée est écrite dans le corps de la réponse (JSON)
- @RestController n'accepte que les requêtes GET
- Il n'y a aucune différence
Quiz de fin de leçon
Quel serveur web Spring Boot embarque-t-il par défaut avec le starter Spring Web ?
- Apache HTTPD
- Tomcat
- Nginx
Quel fichier contient la configuration de l’application (port, nom…) ?
- pom.xml
- src/main/resources/application.properties
- BoutiqueApplication.java
Quelle bibliothèque convertit les objets Java en JSON dans une application Spring Boot web ?
- Jackson
- Hibernate
- JUnit
La suite du cours
- Routes, verbes HTTP et ResponseEntity20 min
- DTO et validation des données20 min
- Couche service et injection de dépendances20 min
- Gestion globale des erreurs et tests de l'API22 min