spring自定义统一全局异常类,实现HandlerExceptionResolver接口

207 阅读1分钟

作用

统一处理异常。


按响应数据类型分类
1.响应数据是ModelAndView
和控制器里的ModelAndView一样,只不过现在是异常页面,并且在显示异常页面之前,会被自定义异常类统一处理异常。

2.响应数据是json格式的字符串
统一处理异常,即不是显示异常页面,而是得到异常json格式的字符串,然后给到前端js回调,界面显示的是异常提示信息。

使用

控制器抛出异常,然后被自定义异常类拦截,统一处理异常。

如果没有异常,就不会被自定义异常类拦截,就是控制器里正常的new ModelAndView。

注意:必须是在控制器里抛出的异常,才会被自定义异常类拦截。

实现自定义异常类

接口

image.png

实现类

实现接口的唯一方法。

package com.xxx.payment.exception;

import xxx.core.exception.BizException;

import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import com.xxx.payment.util.LogUtil;
import com.xxx.payment.util.QrCodeCons;
import com.alibaba.fastjson.JSONObject;

public class BizExceptionResolver implements HandlerExceptionResolver { //实现接口

 private final String ORDER_RETURN_KEY_RESPONSECODE = "responseCode";
 private final String ORDER_RETURN_ERR_VALUE_DISC = "请求交易失败:";

 @Override
 public ModelAndView resolveException(HttpServletRequest request,
   HttpServletResponse response, Object handler, Exception ex) {
  Map<String, String> map = new HashMap<>();
  String errorMsg = ex.getMessage();
  LogUtil.APP.error(errorMsg);
  // 统一处理bizException异常
  if (ex instanceof BizException) {
   errorMsg = errorMsg.substring(errorMsg.lastIndexOf('{') + 1);
   String[] errorArray = errorMsg.split("\\}");
   map.put(ORDER_RETURN_KEY_RESPONSECODE, QrCodeCons.PAGE_STATE_ERR_01);
   map.put("disc", ORDER_RETURN_ERR_VALUE_DISC + errorArray[0]);
   responseMessage(response, JSONObject.toJSONString(map)); //响应数据
  } else {
   map.put(ORDER_RETURN_KEY_RESPONSECODE, QrCodeCons.PAGE_STATE_ERR_01);
   map.put("disc", ORDER_RETURN_ERR_VALUE_DISC + "系统异常");
   responseMessage(response, JSONObject.toJSONString(map));
  }
  return null; //响应页面是null,因为响应数据类型是json格式的字符串,而不是页面
 }

 private void responseMessage(HttpServletResponse response, String message) {
  try {
   response.setContentType("text/html;charset=UTF-8");
   PrintWriter out = response.getWriter();
   out.write(message); //响应数据
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}