定义了全局异常,统一返回值格式, 出现异常或其他错误时发现和统一返回值格式不一致, 考虑下请求未到达本项目中的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>
4. 将全局异常处理类纳入spring容器管理;可以在springmvc配置文件中配置, 也可以在异常处理类上使用 @Component
<!-- 异常处理器 -->
<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