当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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)