尚硅谷尚筹网单一架构知识十四Exception处理

9.2 问题解决思路

在这里插入图片描述

9.3 异步请求特点

在这里插入图片描述

9.4 分辨异步请求的工具方法

在atcrowdfunding-admin-3-common工程加入servlet-api依赖

javax.servlet
servlet-api
provided

/**
 * 用于判断一个请求是否是异步请求
 * @param request
 * @return
 */
public static boolean checkAsyncRequest(HttpServletRequest request) {
	
	// 1.获取相应请求消息头
	String accept = request.getHeader("Accept");
	String xRequested = request.getHeader("X-Requested-With");
	
	// 2.判断请求消息头数据中是否包含目标特征
	if(
		(stringEffective(accept) && accept.contains("application/json")) 
		|| 
		(stringEffective(xRequested) && xRequested.contains("XMLHttpRequest")) ) {
		return true;
	}
	
	return false;
}

9.5 升级后的异常处理器


@ControllerAdvice
public class CrowdFundingExceptionResolever {
	
	@ExceptionHandler(value=Exception.class)
	public ModelAndView catchException(
			Exception exception, 
			HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		
		// 1.对当前请求进行检查
		boolean checkAsyncRequestResult = CrowdFundingUtils.checkAsyncRequest(request);
		
		// 2.如果是异步请求
		if(checkAsyncRequestResult) {
			
			// 3.创建ResultEntity对象
			ResultEntity<String> resultEntity = ResultEntity.failed(ResultEntity.NO_DATA, exception.getMessage());
			
			// 4.将resultEntity转换为JSON格式
			Gson gson = new Gson();
			String json = gson.toJson(resultEntity);
			
			// 5.将json作为响应数据返回给浏览器
			response.setContentType("application/json;charset=UTF-8");
			response.getWriter().write(json);
			
			return null;
		}
		
		ModelAndView mav = new ModelAndView();
		
		mav.addObject("exception", exception);
		
		mav.setViewName("system-error");
		
		return mav;
	}

}

9.6 改进提示消息

所在工程:atcrowdfunding-admin-3-common
全类名:com.atguigu.crowd.funding.util.CrowdFundingConstant

public static final Map<String, String> EXCEPTION_MESSAGE_MAP = new HashMap<>();

static {
	EXCEPTION_MESSAGE_MAP.put("java.lang.ArithmeticException", "系统在进行数学运算时发生错误");
	EXCEPTION_MESSAGE_MAP.put("java.lang.RuntimeException", "系统在运行时发生错误");
	EXCEPTION_MESSAGE_MAP.put("com.atguigu.crowd.funding.exception.LoginException", "登录过程中运行错误");
}


9.7 升级后的异常处理器

所在工程:atcrowdfunding-admin-2-component
全类名:com.atguigu.crowd.funding.exeption.CrowdFundingExceptionResolever
@ControllerAdvice
public class CrowdFundingExceptionResolever {
	
	@ExceptionHandler(value=Exception.class)
	public ModelAndView catchException(
			Exception exception, 
			HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		
		// 1.对当前请求进行检查
		boolean checkAsyncRequestResult = CrowdFundingUtils.checkAsyncRequest(request);
		
		// 2.如果是异步请求
		if(checkAsyncRequestResult) {
			
			// 根据异常类型在常量中的映射,使用比较友好的文字显示错误提示消息
			String exceptionClassName = exception.getClass().getName();
			
			String message = CrowdFundingConstant.EXCEPTION_MESSAGE_MAP.get(exceptionClassName);
			
			if(message == null) {
				message = "系统未知错误";
			}
			
			// 3.创建ResultEntity对象
			ResultEntity<String> resultEntity = ResultEntity.failed(ResultEntity.NO_DATA, message);
			
			// 4.将resultEntity转换为JSON格式
			Gson gson = new Gson();
			String json = gson.toJson(resultEntity);
			
			// 5.将json作为响应数据返回给浏览器
			response.setContentType("application/json;charset=UTF-8");
			response.getWriter().write(json);
			
			return null;
		}
		
		ModelAndView mav = new ModelAndView();
		
		mav.addObject("exception", exception);
		
		mav.setViewName("system-error");
		
		return mav;
	}

}

※需要Gson支持

com.google.code.gson
gson
2.8.5

<context:component-scan base-package=“com.atguigu.crowd.funding.handler,com.atguigu.crowd.funding.exeption,com.atguigu.crowd.funding.config”/>


版权声明:本文为qq_17023977原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。