如何在同一个SpringMvc应用程序中拥有两个ControllerAdvice

时间:2016-01-19 13:56:59

标签: java ajax spring-mvc spring-boot

我想通过两种方式管理简单的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。

您还有其他解决方案吗?

2 个答案:

答案 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)注释以休息异常处理程序。它可能对你有帮助。