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



我想以两种方式管理简单控制器或 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是主要的。

相关内容

  • 没有找到相关文章

最新更新