1
votes

@ControllerAdvice même en définissant la priorité la plus élevée pour les contrôleurs de repos ne fonctionnant pas comme il se doit

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.


1 commentaires

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.


3 Réponses :


0
votes

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


0 commentaires

0
votes
@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

0 commentaires

0
votes

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é.


0 commentaires