我有一个Spring MVC应用程序,它有@Controller
和@RestController
。我在想:当我在我的@Controller
中有一些异常时,它将由我的@ControllerAdvice
处理,当我在我的@RestController
中有一些异常时,它将由我的@RestControllerAdvice
处理。但现在我认为事情不应该是这样的,因为我的@ControllerAdvice
正在捕获所有东西,即使@RestController
...I抛出的任何异常都不知道是否应该发生这种情况。下面是我的代码:
@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);
}
}
发布于 2017-08-11 17:55:14
是的,@RestControllerAdvice不是这样工作的。它只是一个自动假定为@ResponseBody的@ControllerAdvice。参见@RestControllerAdvice vs @ControllerAdvice。
如果你想让一个@ControllerAdvice与一个控制器一起工作,一个与另一个控制器一起工作,那么如果你把你的控制器放在不同的包中,你应该能够做到这一点:
@ControllerAdvice("my.controller1.package")
然而,@ControllerAdvice的全部要点是在彼此之间共享单独的@控制器的公共功能,因此,如果您希望它们做不同的事情,最好将这些方法放在@控制器本身中。
发布于 2021-07-06 18:49:33
如果您希望@RestControllerAdvice
只处理从@RestController
抛出的异常,则可以使用annotations
属性对其进行限定:
@RestControllerAdvice(annotations = RestController.class)
如果你碰巧有几个其它的@ControllerAdvice
,你可能需要@Order
标签。
https://stackoverflow.com/questions/45631766
复制相似问题