使用多个@ControllerAdvice类

时间:2014-08-25 23:33:54

标签: spring spring-mvc exception

我最近开始使用@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";
}

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

但是,由于您正在处理Exception.class上的GlobalDefaultExceptionHandler,因此可能会吞下任何例外。

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