SpringMVC常用配置( 二 )


全局异常处理全局异常主要是通过@ExceptionHandler这个注解来解决 。如下:

@ControllerAdvicepublic class ExceptionHandlerAdvice {//@ExceptionHandler用来设置拦截条件,这里表示拦截所有的Exception@ExceptionHandler(value = https://www.isolves.com/it/cxkf/bk/2019-08-29/Exception.class)public ModelAndView exception(Exception e, WebRequest request) {ModelAndView modelAndView = new ModelAndView("error");modelAndView.addObject("errorMsg", e.getMessage());return modelAndView;}}
首先通过@ControllerAdvice声明一个控制器建言,由于这个注解组合了@Component注解,这个这个类会自动注册为Spring容器中的Bean 。@ExceptionHandler可以定义全局处理,其中Value属性用来表示过滤拦截条件,Exception.class表示拦截所有的Exception 。构造ModelAndView时传入的error表示出错的页面 。OK,我们来看一下控制器,我在控制器中添加如下方法:
@RequestMApping("/user")public String user(@ModelAttribute("msg") String msg, UserBean userBean) {System.out.println("username is :" + userBean.getUsername() + ";and id is :" + userBean.getId());throw new IllegalArgumentException("抱歉,参数异常/ 来自@ModelAttribute:" + msg);}
当我访问/user这个地址的时候,直接抛一个异常,这个异常会被使用了@ExceptionHandler注解并且满足过滤条件的方法接收并处理,我们这里当然是来到了exception这个方法中,在这个方法中我们又定位到了error.jsp页面 。同时这里的参数还使用了@ModelAttribute注解,这个注解我在下一小节再来说 。我们再来看看这个error.jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>出错啦</title></head><body><p><h1>${errorMsg}</h1></p></body></html>
这个页面很简单,就显示一下错误信息就行了 。我们来看看访问结果:
SpringMVC常用配置

文章插图
控制台输出的错误信息:
SpringMVC常用配置

文章插图
预设键值对绑定到Model中
有的时候我们需要预设键值对到Model中,就像上面那个案例那样,这个时候我们可以在ExceptionHandlerAdvice类中再添加一个方法:@ModelAttributepublic void addAttributes(Model model) {model.addAttribute("msg", "额外信息");}
在这个方法中我们向Model中绑定键值对,绑定完成之后,在任何Controller中我们都可以通过给方法的参数设定@ModelAttribute注解来访问这里存入的值,相当于这里的值是一个全局变量 。OK ,这里的访问案例和上文一致,我就不再赘述了 。
预处理前台请求参数OK,还有一种需求,有的时候我们需要预处理前台传来的参数,比如说禁止掉某一个参数,这个也可以统一处理,OK,继续在ExceptionHandlerAdvice方法中添加方法
@InitBinderpublic void initBinder(WebDataBinder webDataBinder) {webDataBinder.setDisallowedFields("id");}
这个表示将客户端传来的id参数忽略掉,但是注意接收的方式,这里通过对象来接收参数的时候才有效(通过对象接收这个参数的时候才会屏蔽掉id),如果直接提取还是可以提取到的,我们来看一下控制器方法,还是刚才抛异常那个方法,但是在抛异常之前我先打印一下日志:
@RequestMapping("/user")public String user(@ModelAttribute("msg") String msg, UserBean userBean) {System.out.println("username is :" + userBean.getUsername() + ";and id is :" + userBean.getId());throw new IllegalArgumentException("抱歉,参数异常/ 来自@ModelAttribute:" + msg);}
我们看看控制台的输出:
SpringMVC常用配置

文章插图
OK,id已经被屏蔽掉了 。
【SpringMVC常用配置】本案例下载地址:https://github.com/lenve/JavaEETest/tree/master/Test18-SpringMVC3


推荐阅读