我想以两种方式管理简单控制器或 RestController 引发的异常:1) 网页重定向2) Json 错误
我测试了下面的代码:
@ControllerAdvice(annotations = Controller.class)
public class ExceptionHandlerController
{
@ExceptionHandler(Exception.class)
public ModelAndView handleException(HttpServletRequest _req, Exception _ex)
{
K_LOGGER.info("test");
return new ModelAndView();
}
}
@ControllerAdvice(annotations = RestController.class)
public class ExceptionHandlerRestController
{
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(HttpServletRequest _req, Exception _ex)
{
return new ResponseEntity<>("test", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@RestController
public class GreetingController
{
@RequestMapping("/greetingexception")
public Greeting greetingException(@RequestParam(value = "name", defaultValue = "World") String name)
throws Exception
{
throw new Exception();
}
}
它不能正常工作,我总是通过ExceptionHandlerController而不是ExceptionHandlerRestController。
我认为这是因为@RestController继承了@Controller。
您有其他解决方案吗?
尝试将 @Order(Ordered.HIGHEST_PRECEDENCE) 注释添加到 rest 异常处理程序。它可能会帮助你。
eg04lt3r 答案是正确的,尽管更多详细信息可能对某人有用。
如果您有全局@ControllerAdvice
并希望在其中一个控制器中以不同的方式处理某些异常,则需要在应该具有更高优先级的@ControllerAdvice
上设置@Order(Ordered.HIGHEST_PRECEDENCE)
。
例如:
@ControllerAdvice
public class GeneralExceptionHandler {
@ExceptionHandler(Exception.class)
protected ResponseEntity<Error> handleException(Exception ex) {
...
}
}
@ControllerAdvice(assignableTypes = MyController.class)
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MyExceptionHandler {
@ExceptionHandler(Exception.class)
protected ResponseEntity<Error> handleException(Exception ex) {
...
}
}
@Order
是必需的,因为在启动时,其中一个处理程序将自动注册更高顺序,无论如何,您的异常处理将变得不可预测。例如,我最近看到一个案例,如果你使用 bootRun gradle 任务启动一个应用程序,MyExceptionHandler
是主要的,但当作为 jar 启动时,GeneralExceptionHandler
是主要的。