Pièges Courants
Guide des erreurs classiques et leurs solutions pour éviter les problèmes avec Micronaut et l’architecture hexagonale.
Apprenez des erreurs courantes pour éviter de perdre des heures de débogage !
1. Lombok ne fonctionne pas dans les Controllers
❌ Symptôme
Symptôme
@Controller
@RequiredArgsConstructor // ← Ne marche pas !
public class MyController {
private final MyService service;
}Erreur : No bean of type MyService available for injection
Conséquences :
- ❌ Le controller ne démarre pas
- ❌ Tests échouent
- ❌ Application ne compile pas correctement
2. Jackson ne peut pas désérialiser mon DTO avec @Value
❌ Symptôme
Symptôme
@Value
public class TrendResponseDto {
String keyword;
Integer score;
}Erreur dans les tests :
Cannot construct instance of `TrendResponseDto`
(no Creators, like default constructor, exist)Problème :
- ❌ Les tests qui désérialisent le JSON échouent
- ❌ Impossible de mapper les réponses HTTP
3. Erreur “reference to assertThat is ambiguous”
❌ Symptôme
Symptôme
Dans les tests :
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK);Erreur : reference to assertThat is ambiguous
Résultat :
- ❌ Les tests ne compilent pas
- ❌ IDE affiche des erreurs
4. Mon bean n’est pas injecté
❌ Symptôme
Symptôme
No bean of type [MyService] existsConséquences :
- ❌ Application ne démarre pas
- ❌ Tests échouent
- ❌ NullPointerException au runtime
5. GlobalExceptionHandler ne marche pas (PIÈGE PSYCHO)
❌ Symptôme
Symptôme
Tu as créé un GlobalExceptionHandler mais les exceptions ne sont pas interceptées.
@Singleton
@Produces
public class GlobalExceptionHandler implements ExceptionHandler<Exception, HttpResponse<ErrorResponse>> {
// Pas appelé !
}Résultat :
- ❌ Erreurs 500 au lieu de 404/400
- ❌ Tests échouent
- ❌ Messages d’erreur par défaut de Micronaut
Récapitulatif
| Type d’erreur | Géré par | Ton handler appelé ? |
|---|---|---|
@QueryValue manquant | Micronaut | ❌ Non |
@Valid échoue | Micronaut | ❌ Non |
| JSON invalide | Micronaut | ❌ Non |
ResourceNotFoundException | TON HANDLER | ✅ Oui |
RuntimeException non géré | TON HANDLER | ✅ Oui |
6. Le Domain dépend de Jackson (VIOLATION ARCHITECTURE)
❌ Symptôme
Symptôme
// ❌ domain/model/Country.java
@Value
public class Country {
@JsonProperty("name") // ❌ Jackson dans le domain !
Name name;
}Conséquences :
- ❌ Tests d’architecture échouent
- ❌ Domain couplé à Jackson
- ❌ Impossible de changer de librairie
7. Mon test échoue de façon aléatoire
❌ Symptôme
Symptôme
@Test
void topicsShouldBeSortedByScore() {
var topics = api.getTopics();
assertThat(topics.get(0).getScore())
.isGreaterThan(topics.get(1).getScore());
}Résultat : Parfois ça passe, parfois ça échoue.
Problème :
- ❌ Tests instables
- ❌ CI/CD aléatoire
- ❌ Difficile à déboguer
8. Mon endpoint retourne 404
❌ Symptôme
Symptôme
@Controller("/api/trends")
public class TrendController {
@Get
public TrendResponseDto getTrends() { }
}Appel à GET /api/trends → 404
Résultat :
- ❌ Endpoint non trouvé
- ❌ Tests échouent
9. mvn test ne trouve pas mes tests
❌ Symptôme
Symptôme
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0Problème :
- ❌ Aucun test exécuté
- ❌ Code non testé
- ❌ Couverture 0%
Checklist de débogage
Quand quelque chose ne marche pas :
Recompiler
mvn clean compileVérifier l’ordre Lombok/Micronaut
Dans le pom.xml, Lombok doit être AVANT Micronaut.
Vérifier les annotations
@Singleton,@Controller,@Inject- Pas de
@Requiresinutiles (surtout sur les ExceptionHandler)
Consulter les logs
Micronaut affiche ce qu’il crée au démarrage :
INFO io.micronaut.runtime.Micronaut - Startup completed in 1234msVérifier les imports
Pas de mélange AssertJ/Hamcrest/JUnit.
Cast pour HttpStatus
assertThat((CharSequence) response.getStatus()).isEqualTo(HttpStatus.OK);Flag -parameters
Activé dans le compiler Maven pour Jackson.
Relancer l’IDE
IntelliJ peut avoir un cache obsolète.
Résumé
Évitez ces pièges courants pour gagner du temps et éviter la frustration !
| Piège | Symptôme | Solution |
|---|---|---|
| Lombok avant Micronaut | Bean pas injecté | Ordre dans pom.xml |
| Jackson + @Value | Cannot construct instance | -parameters + module Jackson |
| assertThat ambiguous | Erreur compilation | Utiliser uniquement AssertJ |
| Bean pas injecté | No bean exists | @Singleton + bon package |
| GlobalExceptionHandler | Pas appelé | Retirer @Requires + tester TES exceptions |
| Jackson dans Domain | Tests archi échouent | DTOs dans infrastructure |
| Tests aléatoires | Instabilité | Trier ou seed fixe |
| Endpoint 404 | Not found | Vérifier chemin + bean + compilation |
| Tests non trouvés | 0 tests run | Nom *Test.java + @Test + public |
Prochaines étapes
Maintenant que vous connaissez les pièges, explorez les bonnes pratiques pour un code propre.
- Code Propre → - SOLID, DDD, conventions
- Tests d’Architecture → - Éviter les violations automatiquement
- Performance → - Optimisations Micronaut
Ressources
- Concepts Micronaut → - Concepts de base
- Tests d’Intégration → - Guide complet des tests
- Documentation Micronaut