定义了全局异常,统一返回值格式, 出现异常或其他错误时发现和统一返回值格式不一致, 考虑下请求未到达本项目中的controller。 特别是新项目和别的项目共用域名,通过转发才能访问到本项目时。
主要操作:
1. 全局异常处理类实现HandlerExceptionResolver接口
2. 在异常处理类中处理相应的异常信息
3. 将全局异常处理类纳入spring容器管理;可以在springmvc配置文件中配置, 也可以在异常处理类上使用 @Component; 个人建议使用配置文件的方式, 方便代码功能的发现。翻看配置文件就能发现有全局异常处理(根据注释)
1.创建GlobalException异常类:
package com.study.spring.cez.exception; /** * @desc: 全局异常封装 * @auth: zona * 2017年5月13日 上午10:42:05 */ public class GlobalException extends Exception { private int errNo; private String errInfo; public GlobalException(int errNo, String errInfo) { super(); this.errNo = errNo; this.errInfo = errInfo; } public int getErrNo() { return errNo; } public String getErrInfo() { return errInfo; } }
2.创建类GlobalExpInterceptor实现HandlerExceptionResolver接口
package com.study.spring.cez.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.json.MappingJackson2JsonView; import com.study.spring.cez.controller.response.JsonResult; import com.study.spring.cez.exception.GlobalException; /** * @desc: * @auth: zona * @createTime: 2017年5月13日 下午12:55:53 */ public class GlobalExpInterceptor implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView mv = null; //如果是自定义异常 if(ex instanceof GlobalException) { GlobalException gExp = (GlobalException) ex; switch (gExp.getErrNo()) { case 1: //在controller上使用@RestController()或在方法上使用@ResponseBody时, 表示要返回json格式的数据 mv = new ModelAndView(new MappingJackson2JsonView()).addObject(JsonResult.fail(gExp.getErrNo(), gExp.getErrInfo())); break; default: break; } } else { mv = new ModelAndView(new MappingJackson2JsonView()).addObject(JsonResult.fail(ex.getMessage())); } return mv; } }
3. MappingJackson2JsonView的使用需要添加相应的jar包
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.2</version> </dependency>
<!-- 异常处理器 --> <bean class="com.study.spring.cez.interceptor.GlobalExpInterceptor" />
/** * @desc: * @auth: zona * 2017年5月13日 上午10:31:08 */ @RequestMapping("/springmvc/user/") @RestController() public class UserController { @RequestMapping(value = "getUser") public JsonResult getUser(Integer flag) throws Throwable { if(flag == 0) { int a = 4/0; } if(flag == 1) { throw new GlobalException(1, "test"); } Map<String, Object> resultMap = new HashMap<>(); return JsonResult.success(resultMap); } }
package com.study.spring.cez.controller.response; import java.util.HashMap; import java.util.Map; /** * @desc: json结果集, 只有三个参数:errNo、errInfo、result * @auth: zona * 2017年5月13日 上午10:44:05 */ public class JsonResult extends HashMap{ /** 存储数据的key */ public static String DATA_KEY = "result"; /** 错误码key */ private String ERR_NO = "errNo"; /** 调用成功默认错误码 */ private static int DEFAULT_SUCCESS_NO = 0; /** 调用失败默认错误码 */ private static int DEFAULT_FAIL_NO = -1000; /** 错误信息key */ private String ERR_INFO = "errInfo"; /** 调用成功错误信息 */ private static String DEFAULT_SUCCESS_INFO = "调用成功"; /** 调用失败错误信息 */ private static String DEFAULT_FAIL_INFO = "调用失败"; private JsonResult(int errNo, String errInfo) { super(); put(ERR_NO, errNo); put(ERR_INFO, errInfo == null ? "" : errInfo); } public JsonResult add(Map resultMap) { put(DATA_KEY, resultMap); return this; } public static JsonResult success() { return new JsonResult(DEFAULT_SUCCESS_NO, DEFAULT_SUCCESS_INFO); } public static JsonResult success(Map resultMap) { JsonResult jsonResult = new JsonResult(DEFAULT_SUCCESS_NO, DEFAULT_SUCCESS_INFO); jsonResult.put(DATA_KEY, resultMap); return jsonResult; } public static JsonResult fail(String errInfo) { return new JsonResult(DEFAULT_FAIL_NO, errInfo); } public static JsonResult fail(int errNo, String errInfo) { return new JsonResult(errNo, errInfo); } public static JsonResult fail() { return new JsonResult(DEFAULT_FAIL_NO, DEFAULT_FAIL_INFO); } }
http://localhost:2222//springmvc/user/getUser?flag=0
http://localhost:2222//springmvc/user/getUser?flag=1