@RestControllerAdvice 和@ControllerAdvice 在一起
@RestControllerAdvice and @ControllerAdvice together
我有一个 Spring MVC 应用程序,它有 @Controller
s 和 @RestController
s。
我在想:当我的 @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);
}
}
是的@RestControllerAdvice 不是那样工作的。它只是一个@ControllerAdvice,自动假定为@ResponseBody。参见 。
如果你想让一个@ControllerAdvice 与一个控制器一起工作,一个与另一个控制器一起工作,那么如果你将你的控制器放在单独的包中,你应该能够通过以下方式做到这一点:
@ControllerAdvice("my.controller1.package")
但是,@ControllerAdvice 的全部意义在于在彼此之间共享单独的@Controller 的通用功能,因此如果您希望它们做单独的事情,最好将方法放在@Controller 本身中。
如果你想让@RestControllerAdvice
只处理从@RestController
抛出的异常,那么你可以用annotations
属性限定它:
@RestControllerAdvice(annotations = RestController.class)
如果您碰巧有其他几个 @ControllerAdvice
,您可能需要 @Order
标签。
我有一个 Spring MVC 应用程序,它有 @Controller
s 和 @RestController
s。
我在想:当我的 @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);
}
}
是的@RestControllerAdvice 不是那样工作的。它只是一个@ControllerAdvice,自动假定为@ResponseBody。参见
如果你想让一个@ControllerAdvice 与一个控制器一起工作,一个与另一个控制器一起工作,那么如果你将你的控制器放在单独的包中,你应该能够通过以下方式做到这一点:
@ControllerAdvice("my.controller1.package")
但是,@ControllerAdvice 的全部意义在于在彼此之间共享单独的@Controller 的通用功能,因此如果您希望它们做单独的事情,最好将方法放在@Controller 本身中。
如果你想让@RestControllerAdvice
只处理从@RestController
抛出的异常,那么你可以用annotations
属性限定它:
@RestControllerAdvice(annotations = RestController.class)
如果您碰巧有其他几个 @ControllerAdvice
,您可能需要 @Order
标签。