@RestControllerAdvice和@ControllerAdvice一起

And*_*dre 4 spring controller exception-handling spring-restcontroller

我有一个带有@Controllers和@RestControllers 的Spring MVC应用程序。我当时在想:当我遇到异常时@Controller,它将由我处理;@ControllerAdvice当我遇到异常时@RestController,将由我处理@RestControllerAdvice...但是现在,我认为这不是事情的工作方式,因为我@ControllerAdvice正在捕获所有内容,甚至是由@RestController... 引发的任何异常,我不知道是否应该发生这种情况。这是我的代码:

 @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);        
  }    
}
Run Code Online (Sandbox Code Playgroud)

Plo*_*log 5

是的@RestControllerAdvice不能那样工作。它只是一个自动带有@ResponseBody的@ControllerAdvice。参见@RestControllerAdvice与@ControllerAdvice

如果您希望一个@ControllerAdvice与一个控制器一起工作而一个与另一个控制器一起工作,那么如果您将控制器放在单独的包中,则应该能够做到这一点:

@ControllerAdvice("my.controller1.package")
Run Code Online (Sandbox Code Playgroud)

但是,@ ControllerAdvice的重点是彼此之间共享单独的@Controllers的通用功能,因此,如果希望它们执行单独的操作,则最好将方法放在@Controllers自身内部。