请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 699|回复: 0

Spring Boot2.0连载(36)-- @ControllerAdvice处理异常

[复制链接]
发表于 2018-5-25 20:42:23 | 显示全部楼层 |阅读模式
更多Spring Boot2.0的知识敬请期待疯狂软件著作《Spring Boot企业应用实战》上市



对于使用@ExceptionHandler完成异常处理也有着它自己的缺点,那就是代码耦合严重,一旦哪天忘记继承 BaseController,异常就没有进行处理并且直达客户了。想要解除这种耦合关系,可以使用 @ControllerAdvice 来进行处理。
@ControllerAdvice注解的类是当前项目中所有类的统一异常处理类,@ExceptionHandler注解的方法用来定义函数针对的异常类型以及异常如何处理,就不用每个Controller中逐一定义异常处理方法了。
前面的示例当中使用ModelAndView保存属性返回异常信息,在很多时候,需要返回json数据,Spring Boot中操作也非常简单,只需在@ExceptionHandler之后加入@ResponseBody,就能将处理方法返回的Map集合转换为JSON格式。


示例 Advice处理异常返回JSON

GlobalExceptionHandler.java:

  1. import javax.servlet.http.HttpServletRequest;
  2. import org.springframework.web.bind.annotation.ControllerAdvice;
  3. import org.springframework.web.bind.annotation.ExceptionHandler;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. import java.util.HashMap;
  6. import java.util.Map;

  7. @ControllerAdvice
  8. public class GlobalExceptionHandler {

  9.     @ExceptionHandler(value = Exception.class)
  10.     @ResponseBody
  11.     public Object globalErrorHandler(HttpServletRequest request,Exception e) throws Exception {
  12.         System.out.println("GlobalExceptionHandler globalErrorHandler()......");
  13.         // 创建返回对象Map并设置属性,会被@ResponseBody注解转换为JSON返回
  14.         Map<String, Object> map = new HashMap<>();
  15.         map.put("code", 100);
  16.         map.put("message", e.getMessage());
  17.         map.put("url", request.getRequestURL().toString());
  18.         map.put("data", "请求失败");
  19. return map;
  20.     }
  21.    
  22. }

复制代码


DeptController.java:

  1. import org.springframework.stereotype.Controller;
  2. import org.springframework.web.bind.annotation.RequestMapping;

  3. @Controller
  4. public class DeptController {

  5.     @RequestMapping("/add")
  6.     public String add(String deptname) throws Exception{
  7.         System.out.println("add()......");
  8.         if(deptname == null ){
  9.             throw new NullPointerException("部门名称不能为空!");
  10.         }
  11.         return "success";
  12.     }   
  13. }
复制代码



当发送“add”请求,进入DeptController的add方法,该方法中接收一个参数,当参数为空时抛出异常,会被@ControllerAdvice注解修饰的全局异常处理类使用@ExceptionHandler注解的globalErrorHandler方法进行处理,异常信息被封装到返回对象Result,并转为JSON返回,如图所示。

图3.25 Advice异常处理.png

Spring MVC的异常处理方式中,@ControllerAdvice毫无疑问是最方便的,所以在实际开发当中,@ControllerAdvice也是用的最多的。而且异常处理的返回结果非常灵活,如果返回的是View(视图),方法的返回值是ModelAndView;如果返回的是String或者JSON数据,那么只需要在方法上添加@ResponseBody注解就可以了。



您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

微信群请扫二维码
QQ交流1群:
545923995
(未满)

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2020-2-25 11:38 , Processed in 0.269097 second(s), 7 queries , File On.

快速回复 返回顶部 返回列表