1

J'ai une application Spring MVC qui a @Controller s et @RestController s. Je pensais que: Quand j'ai une exception à mon @Controller, ça va être géré par mon @ControllerAdvice et quand j'ai une exception à mon @RestController, ça va être géré par mon @RestControllerAdvice ... Mais maintenant je pense que ce n'est pas comment le les choses fonctionnent, parce que mes @ControllerAdvice attrapent tout, même que lancé par @RestController ... Je ne sais pas si cela devrait arriver. Voici mon code:@RestControllerAdvice et @ControllerAdvice ensemble

@ControllerAdvice 
public class ExceptionHandlerController { 

private final String DEFAULT_ERROR_VIEW = "error/default"; 

    @ExceptionHandler(Exception.class) 
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) 
    { 
     ModelAndView mav = new ModelAndView(); 
     mav.addObject("exception", e); 
     mav.addObject("danger", e.getMessage()); 
     mav.addObject("url", req.getRequestURL()); 
     mav.setViewName(DEFAULT_ERROR_VIEW); 
     return mav; 
    } 
} 


@RestControllerAdvice 
public class ExceptionHandlerRestController { 

    @ExceptionHandler(Exception.class) 
    public ResponseEntity<String> defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception { 
     return new ResponseEntity<>(" test "+e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);   
    }  
} 

Répondre

1

Oui, @RestControllerAdvice ne fonctionne pas de cette façon. C'est juste un @ControllerAdvice avec @ResponseBody supposé automatiquement. Voir @RestControllerAdvice vs @ControllerAdvice.

Si vous vouliez un @ControllerAdvice travailler avec un contrôleur et un à travailler avec l'autre alors si vous mettez vos contrôleurs dans des emballages séparés, vous devriez être en mesure de le faire en faisant:

@ControllerAdvice("my.controller1.package") 

Cependant, Le but de @ControllerAdvice est de partager les fonctionnalités communes de vos @Controllers séparés entre eux, donc si vous voulez qu'ils fassent des choses séparées, mieux vaut simplement mettre les méthodes dans les @Controllers eux-mêmes.

+0

Merci, donc si je mets mes contrôleurs et RestControllers à certains paquets séparés, je serai capable de faire quelque chose comme ça? @ControllerAdvice ("com.controller") et @RestControllerAdvice ("com.controller.rest"), donc les exceptions au contrôleur seront transmises par ControllerAdvice et les exceptions à controller.rest seront transmises par RestControllerAdvice? –

+0

ControllerAdvice gère toujours tout ... Peut-être package plus spécifique, je vais essayer maintenant ... –

+0

Ouais fonctionne maintenant .... J'ai changé de paquets @RestControllerAdvice ("com.rest.controller") au lieu de @RestControllerAdvice (" com.controller.rest ") et fonctionne maintenant. –