J'utilise SpringBoot 5.
Je veux attraper toutes les exceptions lancées par RestController
et afficher le format de message personnalisé.
J'ai simplifié la situation comme ci-dessous:
Le RestController
@Order(Ordered.HIGHEST_PRECEDENCE) @ControllerAdvice(annotations = RestController.class) public class RestExceptionHandler { private static final Logger LOGGER = LoggerFactory.getLogger(RestExceptionHandler.class); @ExceptionHandler(value= {CustomException.class}) public ResponseEntity<ErrorDetail> handleCustomException(CustomException exception, HttpServletRequest request) { ErrorDetail errorDetail = new ErrorDetail(); errorDetail.setTimeStamp(Instant.now().getEpochSecond()); errorDetail.setStatus(HttpStatus.NOT_FOUND.value()); errorDetail.setTitle("Resource Not Found"); errorDetail.setDetail(exception.getMessage()); errorDetail.setDeveloperMessage(exception.getClass().getName()); return new ResponseEntity<>(errorDetail, null, HttpStatus.NOT_FOUND); } }
Le gestionnaire d'exceptions ControllerAdvice:
@RestController @RequestMapping("/test") public class TestRestController { @Autowired private TestService testService; @GetMapping("/{id}") public ResponseEntity<?> findById(@PathVariable int id) { Test test = testService.find(id); if(department!=null){ throw CustomException(); } return new ResponseEntity<>(test, HttpStatus.OK); } }
Le problème c'est que RestExceptionHandler
ne fonctionne pas, il n'attrape pas l'exception et ne renvoie pas le format de message d'erreur modifié. Il semble que mon RestExceptionControllerClass
ne remplace pas le GlobalExceptionHandler
. Je ne sais pas pourquoi cela se produit car j'ai marqué le RestExceptionHandler
avec le plus haut précédent. J'apprécierai toute indication pour déboguer ce problème.
3 Réponses :
Modifiez votre classe RestExceptionHandler
comme ci-dessous
@RestControllerAdvice public class RestExceptionHandler { @ResponseStatus(HttpStatus.NOT_FOUND) @ExceptionHandler(CustomException.class) public ResponseEntity<ErrorDetail> handleCustomException(CustomException exception) { ErrorDetail errorDetail = new ErrorDetail(); errorDetail.setTimeStamp(Instant.now().getEpochSecond()); errorDetail.setTitle("Resource Not Found"); errorDetail.setDetail(exception.getMessage()); errorDetail.setDeveloperMessage(exception.getClass().getName()); return new ResponseEntity<>(errorDetail, null, HttpStatus.NOT_FOUND); } }
Et vous devez également étendre RuntimeException
dans votre code CustomException > classe
@ControllerAdvice public class RestExceptionHandler { @ResponseStatus(HttpStatus.NOT_FOUND) @ResponseBody @ExceptionHandler(CustomException.class) public ErrorDetail handleCustomException(CustomException exception) { ErrorDetail errorDetail = new ErrorDetail(); errorDetail.setTimeStamp(Instant.now().getEpochSecond()); errorDetail.setTitle("Resource Not Found"); errorDetail.setDetail(exception.getMessage()); errorDetail.setDeveloperMessage(exception.getClass().getName()); return errorDetail; } } Refer this link to know more about exception handling for REST API https://www.baeldung.com/exception-handling-for-rest-with-spring
Le problème était qu'une autre exception avait été levée avant mon CustomException
. Dans l'appel de service, il y avait une partie du code qui a jeté une exception à laquelle je ne m'attendais pas. Donc, mon RestExceptionHandler n'a pas pu attraper l'exception car il n'avait pas de méthode pour gérer cette exception et donc le GlobalExceptionHandler
gérait cette exception. Après avoir corrigé le code et vérifié que CustomExeption
était lancé, tout fonctionnait comme il se doit. Le RestExceptionHandler
a géré l'exception et imprimé le message personnalisé.
Merci pour vos réponses, le problème était que je n'avais pas vérifié qu'il s'agissait d'une autre partie de mon code qui générait une erreur qui n'était pas gérée dans ma gestion des exceptions personnalisée.