来自同一ExceptionHandler

时间:2015-09-08 10:50:57

标签: spring exception exception-handling spring-boot exceptionhandler

在我目前的spring-boot项目中,我有这个ExceptionHandler:

@ControllerAdvice
public class GlobalDefaultExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception error) throws Exception {
        if (AnnotationUtils.findAnnotation(error.getClass(), ResponseStatus.class) != null)
            throw error;

        ModelAndView mav = new ModelAndView();
        mav.setAttribute("error", error);
        return mav;
    }

}

我想要做的是让这个处理程序重定向到不同的错误页面,这取决于错误的来源。

我有两种类型"我的项目中的页面:由匿名用户或经过身份验证的用户访问的公共页面,以及仅由经过身份验证的用户访问的管理页面(私有)。

这两种类型的页面有不同的风格。我想,当用户在公共页面中发生错误时,会显示带有公共样式的错误页面。如果用户在私有页面中时发生错误,则会显示另一个错误页面,其中显示私有页面的样式。

2 个答案:

答案 0 :(得分:0)

您可以构建一个选择它需要在控制器中抛出的异常类,假设如下:

Address

假设这是@RequestMapping(value = "/check") public ModelAndView processUser( ) throws Exception { ModelAndView modelAndView = new ModelAndView(); if (something... ) { throw new GlobalDefaultExceptionHandler( ); // throws GlobalDefaultExceptionHandler } if (something else... ) { throw new AnotherExceptionHandler( );// throws 'anotherExceptionHandler' } // If there isn't exception thrown....do something } 类:

AnotherExceptionHandler

但是如果你被迫只使用一个处理程序,你可以直接使用选择:

@ControllerAdvice
public class AnotherExceptionHandler{

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception error) throws Exception {
        if (AnnotationUtils.findAnnotation(error.getClass(), ResponseStatus.class) != null)
            throw error;

        // Go to another view
        ModelAndView mav = new ModelAndView();
        mav.setAttribute("anotherError", error);
        return mav;
    }

}

答案 1 :(得分:0)

有几种选择。其中一些是:

  1. 您可以使用request.getUserPrincipal()检查用户是否已通过身份验证。如果用户未经过身份验证,则返回值为null。根据结果​​,您可以返回不同的视图。

  2. 让所有Contoller服务公共页面从一个PublicBaseController扩展,控制器服务专用页面扩展PrivateBaseController。将带有@ExceptionHandler注释的方法添加到基本控制器,这些控制器返回适当的视图。