【问题标题】:Working with multiple @ControllerAdvice classes使用多个 @ControllerAdvice 类
【发布时间】:2014-08-25 23:33:54
【问题描述】:

我最近开始使用 @ControllerAdvice 类来管理我的 Spring 项目中的异常。我目前的实现是这样的:

@ControllerAdvice
public class GlobalDefaultExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) throw e;
        return new ModelAndView("error/5xx", "exception", e);
    }

}

我的下一步应该是处理更多异常,但为此我正在考虑使用多个带有@ControllerAdvice 的类,其中一个用于http 状态代码。我的目标是让我的控制器处理表单提交的方法将用户重定向到我的一些自定义状态页面(每个组都有一个 - 1xx、2xx、3xx、4xx、5xx)。

这些方法的结构类似于:

@RequestMapping(value="cadastra")
@PreAuthorize("hasPermission(#user, 'cadastra_'+#this.this.name)")
public String cadastra(Model model) throws InstantiationException, IllegalAccessException {
    model.addAttribute("command", this.entity.newInstance());
    return "private/cadastrar";
}

任何人都可以告诉我这是否是一个好方法,并给出一些提示如何实现我的控制器方法来完成我想要的?

【问题讨论】:

标签: spring spring-mvc exception


【解决方案1】:

您可以拥有多个处理不同异常的@ControllerAdvice 类。

但是,由于您正在处理 GlobalDefaultExceptionHandler 上的 Exception.class,因此任何异常都可能被它吞没。

我解决这个问题的方法是在我的一般异常处理程序上添加@Order( value = Ordered.LOWEST_PRECEDENCE ) ,在其他异常处理程序上添加@Order( value = Ordered.HIGHEST_PRECEDENCE )

【讨论】:

  • 谢谢,这是现有项目的问题,创建了一个建议没有捕捉到我的异常,我发现 Throwable 类中有一个全局自己的绑定...
  • 很高兴听到@Vincent,保重!
【解决方案2】:

也许您想定义特定的异常类(由您的控制器抛出,例如:NoResourceFoundException 或 InvalidResourceStatusException 等),以便您的 ExceptionController 可以分离不同的情况并将它们重定向到正确的状态页面。

【讨论】:

    猜你喜欢
    • 2013-10-30
    • 2014-09-06
    • 2021-07-20
    • 1970-01-01
    • 2019-07-27
    • 2019-10-03
    • 2019-06-29
    • 1970-01-01
    • 2020-11-15
    相关资源
    最近更新 更多