博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

@ControllerAdvice

Posted on 2018-11-25 15:46  LQliu  阅读(270)  评论(0)    收藏  举报

1、@ControllerAdvice(Spring3.2提供的 注解)拦截异常并统一处理是一个@Component,用于定义@ExceptionHandler、@InitBinder、
@ModelAttribute方法并应用到所用的@RequestMapping中。使用@ControllerAdvice,不用任何的配置,
只要把这个类放到Spring能扫描到的地方,就可以实现全局异常的回调。只有@ExceptionHandler最有用,另外两个用处不大。
该注解使用@Component注解,这样的话当我们使用<context:component-scan>扫描时也能扫描到。
@ControllerAdvice
public class MyControllerAdvice {
2、@InitBinder:在其执行之前初始化数据绑定器,用于参数的统一处理
@InitBinder
public void initBinder(WebDataBinder binder) {}
3、@ModelAttribute:把值绑定到Model中,使全局@RequestMapping可以获取到该值
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("author", "Magical Sam");
}
4、@ExceptionHandler: 全局异常捕捉处理
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Map errorHandler(Exception ex) {
Map map = new HashMap();
map.put("code", 100);
map.put("msg", ex.getMessage());
return map;
}
}
启动应用后,被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法,都会作用在被@RequestMapping注解的方法上。

@ModelAttribute:在Model上设置的值,对于所有被@RequestMapping注解的方法中,都可以通过 ModelMap 获取
@RequestMapping("/home")
public String home(ModelMap modelMap) {
System.out.println(modelMap.get("author"));
}
//或者 通过@ModelAttribute获取
@RequestMapping("/home")
public String home(@ModelAttribute("author") String author) {
System.out.println(author);
}
@ExceptionHandler拦截异常,我们可以通过该注解实现自定义异常处理。其中,@ExceptionHandler配置的 value 指定需要拦截的异常类型
2、自定义异常处理(全局异常处理)
spring boot默认情况下发送异常时会映射到 /error进行异常处理,根据不同的Content-Type展现不同的错误结果,
如json请求时,直接返回json格式参数。这样不友好,我们会采用自定义异常处理的方式进行异常处理
1、编写自定义异常类:
public class MyException extends RuntimeException {

public MyException(String code, String msg) {
this.code = code;
this.msg = msg;
}
private String code;
private String msg;
}
//spring 对于 RuntimeException异常会进行事务回滚。
2、编写全局异常处理类
@ControllerAdvice
public class MyControllerAdvice {
//全局异常捕捉处理
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Map errorHandler(Exception ex) {
Map map = new HashMap();
map.put("code", 100);
map.put("msg", ex.getMessage());
return map;
}
//拦截捕捉自定义异常 MyException.class
@ResponseBody
@ExceptionHandler(value = MyException.class)
public Map myErrorHandler(MyException ex) {
Map map = new HashMap();
map.put("code", ex.getCode());
map.put("msg", ex.getMsg());
return map;
}
}
3、controller中抛出异常进行测试
@RequestMapping("/home")
public String home() throws Exception {
throw new MyException("101", "Sam 错误");
}
启动应用,正常显示以下json内容,证明自定义异常已经成功被拦截。
{"msg":"Sam 错误","code":"101"}