springmvc 统一异常处理

本文介绍如何在Spring MVC项目中实现全局异常处理,包括自定义异常类、异常拦截器及JSON结果封装等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


定义了全局异常,统一返回值格式, 出现异常或其他错误时发现和统一返回值格式不一致, 考虑下请求未到达本项目中的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" />


5.controller代码
/**
 * @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);
	}
}


6.JsonResult类

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);
	}
}


7.测试url

http://localhost:2222//springmvc/user/getUser?flag=0

http://localhost:2222//springmvc/user/getUser?flag=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值