当SpringMVC的Controller出现异常(Exception)时,如何作到及时处理(跳转错误页面)

当SpringMVC的Controller出现异常时,如何作到及时处理呢?对用于来讲比较友好的处理方法就是当出现不一样的异常时给予不一样的错误提示页面。html

在代码实现上,这里借助@ControllerAdvice@ExceptionHandler来实现。前端

首先介绍实现过程,而后再对上述标签作出解释app

1、实现过程this

/** 经过下面的代码实现,全部其余Controller中使用了@RequestMapping注解的方法,在运行过程当中抛出异常时就会获得相应的处理。 */
@ControllerAdvice
public class ValidateMsgConfig {
    private final Log log = LogFactory.getLog(this.getClass());
    
    /** 当出现业务异常时,将自定义异常类CustomError的内容返回并显示到页面上 */
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public CustomError handleBusinessException(BusinessException e) {
        log.error(e.getMessage(), e);
        return new CustomError();
    }

    /** 当出现其余异常时,将跳转到自定义的错误页面 */
    @ExceptionHandler(OtherException.class)
    public String handleException(Exception e) {
        log.error(e.getMessage(), e);
        return "/common/index/500.html";
    }
}

2、标签解释spa

@ControllerAdvicehtm

这个注解新增于Spring3.2版本中。对象

首先这个注解只能使用在类、接口或枚举类型之上(由于它的@Target设置成了ElementType.TYPE),而且使用了这个注解的类也就成了Spring容器中的一个Bean(由于这个主机拥有@Component注解的功能)。接口

它的做用就是协助其余普通Controller完成一些辅助功能。比较典型的用途就是在使用了@ExceptionHandler/@InitBinder/@ModelAttribute和@RequestMapping注解的方法上起到必定的做用,具体起到什么做用呢?其实就是@ExceptionHandler/@InitBinder/@ModelAttribute这3个注解起到的做用(@RequestMapping都比较熟悉,就不讲了),下面会说到@ExceptionHandler、@InitBinder和@ModelAttribute的做用。ci

在这个注解中可使用basePackages、value、basePackageClasses这样的selector对所要做用的Controller限定范围,若是不加这些selector,则@ControllerAdvice将做用于全部的Controller之上。get

@ExceptionHandler

这个注解在String3.0中新增长,只能使用在方法上。做用是:经过指定具体的异常处理类或异常处理方法进行异常处理。

经过在方法上使用该注解,这些方法的参数中可使用以下类型的参数:Exception、Request、Response、Session、WebReqeust/NativeWebRequest、Locale、InputStream、Reader、OutputStream、Writer、Model。方法的返回值类型可使用以下类型:ModelAndView、Model、Map、View、String、HttpEntity、ResponseEntity、void。

@InitBinder

这个注解在String2.5中新增长,只能使用在方法上。做用是:初始化方法中的WebDataBinder参数,WebDataBinder的做用是完成表单字段到JavaBean属性的绑定。

使用该注解的方法支持全部RequestMapping支持使用的参数,除命令/表单对象以及相应的校验结果对象以外。另外,使用该注解的方法不容许有返回值,返回值类型通常都为void。

注意这个注解须要和RequestMapping配合使用。

@ModelAttribute

这个注解在String2.5中新增长,能使用在方法或参数上。做用:若是该注解做用在方法参数上(注意:这个方法必定是使用了@RequestMapping的方法哦),则会将该参数值绑定到Model对象中;若是该注解做用在方法上(注意:这个方法也必定是使用了@RequestMapping的方法哦),则会将方法返回值绑定到Model对象中,最后将Model对象返回到页面上。注意这个注解须要和Controller中的带有RequestMapping注解的方法配合使用。

注意:若是在请求过程当中发生了异常,那么这些被放入Model中的数据是没法在前端页面接收的。

相关文章
相关标签/搜索