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

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

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

首先介绍实现过程,然后再对上述标签做出解释

一、实现过程

/** 通过下面的代码实现,所有其他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";
    }
}

二、标签解释

@ControllerAdvice

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

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

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

在这个注解中可以使用basePackages、value、basePackageClasses这样的selector对所要作用的Controller限定范围,如果不加这些selector,则@ControllerAdvice将作用于所有的Controller之上。

@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中的数据是无法在前端页面接收的。

 

转载于:https://my.oschina.net/u/3272058/blog/3016647

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值