我想通过两种方式管理简单的Controller或RestController抛出的异常: 1)html重定向 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。
您还有其他解决方案吗?
答案 0 :(得分:1)
eg04lt3r 答案是正确的,尽管更多细节可能对某人有用。
如果您拥有全局width*height*3
并希望以不同的方式处理其中一个控制器中的异常,则需要在@ControllerAdvice
上设置@Order(Ordered.HIGHEST_PRECEDENCE)
,该优先级应具有更高的优先级。
例如:
@ControllerAdvice
@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) {
...
}
}
是必需的,因为在启动时,其中一个处理程序将自动以较高的顺序注册,并且您的异常处理将变得不可预测。例如,最近我看到一种情况,如果您使用bootRun gradle任务@Order
启动应用程序为主要任务,而以jar MyExceptionHandler
启动则为主要任务。
答案 1 :(得分:0)
尝试添加@Order(Ordered.HIGHEST_PRECEDENCE)注释以休息异常处理程序。它可能对你有帮助。