作用
统一处理异常。
按响应数据类型分类
1.响应数据是ModelAndView
和控制器里的ModelAndView一样,只不过现在是异常页面,并且在显示异常页面之前,会被自定义异常类统一处理异常。
2.响应数据是json格式的字符串
统一处理异常,即不是显示异常页面,而是得到异常json格式的字符串,然后给到前端js回调,界面显示的是异常提示信息。
使用
控制器抛出异常,然后被自定义异常类拦截,统一处理异常。
如果没有异常,就不会被自定义异常类拦截,就是控制器里正常的new ModelAndView。
注意:必须是在控制器里抛出的异常,才会被自定义异常类拦截。
实现自定义异常类
接口
实现类
实现接口的唯一方法。
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();
}
}
}