通过@ControllerAdvice
。我们可以将对于控制器的全局配置放置在同一个位置,注解了@ControllerAdvice
的类的方法可以使用@ExceptionHandler
,@InitBinder
,@ModelAttribute
注解到方法上,这对所有注解了@RequestMapping
的控制器内的方法有效。
@ExceptionHandler
:用于全局处理控制器里面的异常。@InitBinder
:用来设置WebDataBinder
,WebDataBinder
用来自动绑定前台请求参数到Model
中。@ModelAttribute
:@ModelAttribute
本来的作用是绑定键值对到Model
里,此处是让全局的@RequestMapping
都能获得在此处设置的键值对。
下面将使用@ExceptionHandler
处理全局异常,将异常信息更加人性化的输出给用户。
@ControllerAdvice
@ControllerAdvice public class ExceptionHandlerAdvice { @ExceptionHandler(value = Exception.class) public ModelAndView exception(Exception exception, WebRequest request) { ModelAndView modelAndView = new ModelAndView("error");// error页面 modelAndView.addObject("errorMessage", exception.getMessage()); return modelAndView; } @ModelAttribute public void addAttributes(Model model) { model.addAttribute("msg", "额外信息"); } @InitBinder public void initBinder(WebDataBinder webDataBinder) { webDataBinder.setDisallowedFields("id"); } }
① @ControllerAdvice
声明一个控制器建言,@ControllerAdvice
组合了@Component
注解,所以自动注册为Spring的Bean
。
② @ExceptionHandler
在此处定义全局处理,通过@ExceptionHandler
的value
属性可过滤拦截的条件,在此处可以看出拦截的是所有的Exception
。
③ 此处使用@ModelAttribute
注解将键值对添加到全局,所有注解了@RequestMapping
的方法可获得此键值对。
④ 通过@InitBinder
注解定制WebDataBinder
。
演示@ModelAttribute
@Controller public class AdviceController { @RequestMapping("/advice") public String getSomething(@ModelAttribute("msg") String msg,DemoObj obj){ throw new IllegalArgumentException("非常抱歉,参数有误/"+"来自@ModelAttribute:"+ msg); } }
演示@ExceptionHandler
在访问 /advice的时候,抛出了异常,直接调转到了error.jsp页面
注意点:我在测试的时候,error.jsp
里面el
表达式的值取不出来,拿不到后台传过来的值。后来找到的原因是:web.xml
的头内容版本是2.3
的话默认jsp
不开启el
解析,需要开启解析,在error.jsp
头部增加如下配置:
<%@ page isELIgnored="false" %>
增加上面的配置之后问题就解决了。
转载:人生设计师