@RestControllerAdvice和@ControllerAdvice在一起

时间:2017-08-11 09:36:04

标签: spring exception-handling controller spring-restcontroller

我有一个具有@Controller@RestController s的Spring MVC应用程序。 我在想:当我在@Controller处有一些异常时,它将由我的@ControllerAdvice处理,当我在@RestController处有一些异常时,它将由我{@RestControllerAdvice处理。 {1}} ...但现在我认为事情不应该如何运作,因为我的@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);        
  }    
}

2 个答案:

答案 0 :(得分:4)

是的@RestControllerAdvice无法正常工作。它只是一个自动假设@ResponseBody的@ControllerAdvice。请参阅@RestControllerAdvice vs @ControllerAdvice

如果您希望一个@ControllerAdvice与一个控制器配合使用,另一个与另一个控制器配合使用,那么如果您将控制器放在不同的软件包中,您应该可以这样做:

@ControllerAdvice("my.controller1.package")

然而,@ ControllerAdvice的重点是分享彼此之间的@Controllers的共同功能,所以如果你想让它们分开做些事情,你可能最好把这些方法放在@Controllers本身。

答案 1 :(得分:0)

如果您希望 @RestControllerAdvice 仅处理从 @RestController 抛出的异常,那么您可以使用 annotations 属性对其进行限定:

@RestControllerAdvice(annotations = RestController.class)

如果您碰巧有其他几个 @Order,您可能需要 @ControllerAdvice 标签。