Spring 全局异常拦截根据业务返回不同格式数据 自定义异常
1.全局异常拦截:针对所有异常进行拦截 可根据请求自定义返回格式
2.自定义异常类 处理不同业务的异常
接下来开始入手代码:
1).自定义异常类
@ControllerAdvice//添加注解 记得开启spring的全局扫描
public class BusinessException extends RuntimeException {
private static final long serialVersionUID = 2332608236621015980L; private String code;
public BusinessException(String code,String message) {
super(message);
this.code = code;
} public BusinessException() {
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
}
}
2).全局异常处理器(对拦截到的异常进行分类处理)
/**
* 全局异常处理器
* @author chenhao
*/
public class BusinessExceptionResolver implements HandlerExceptionResolver {
/**日志log*/
private static Logger log = LoggerFactory.getLogger(BusinessExceptionResolver.class); //系统抛出的异常
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
//handler就是处理器适配器要执行的Handler对象(只有method)
//解析出异常类型。
/* 使用response返回 */
response.setStatus(HttpStatus.OK.value()); //设置状态码
response.setContentType(MediaType.APPLICATION_JSON_VALUE); //设置ContentType
response.setCharacterEncoding("UTF-8"); //避免乱码
response.setHeader("Cache-Control", "no-cache, must-revalidate");
//如果该 异常类型是系统 自定义的异常,直接取出异常信息。
BusinessException businessException=null;
try {
//根据请求方式返回不同的格式(根据自己的业务需求实现,如果只返回一种格式的不用判断)
//统一返回json 自定义了返回Result类 引入了Jackson
if ("application/json".equals(request.getContentType())){
if(ex instanceof BusinessException){
businessException = (BusinessException)ex;
//错误信息
log.error(ex.getMessage(),ex);
response.getWriter().write(Result.error(businessException.getCode(),ex.getMessage()).toString());
}else {
log.error(ex.getMessage(),ex);
response.getWriter().write(Result.error("-1", ex.getMessage()).toString());
}
}else {
//统一返回xml格式
Message message = new Message(Constants.RESULT_FAIL);
message.setScript(ex.toString());
response.setContentType("text/xml");
response.getWriter().write(XmlUtil.objectToString(message));
} } catch (IOException e) {
log.error("与客户端通讯异常:"+ e.getMessage(), e);
e.printStackTrace();
}
ModelAndView modelAndView=new ModelAndView(); return modelAndView;
} }
3).Spring配置文件添加
springMVC启动加载时会将所有的异常处理HandlerExceptionResolver实现类存放到handlerExceptionResolvers一个map结构中。
<bean id="exceptionResolver" class="com.*.exception.BusinessExceptionResolver"></bean>
4).使用方式(我这里只针对JSON)

返回格式:
json格式:
{
"success": false,
"errorcode": "10",
"errormsg": "特征值不能为空",
"data": null
}
xml格式:
<?xml version="1.0" encoding="UTF-8"?>
<Message code="00001" script="java.lang.NullPointerException" rowCount=""/>
目前知道的还可以定义很多异常来让框架简易。多学学总没错。
Spring 全局异常拦截根据业务返回不同格式数据 自定义异常的更多相关文章
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
- SpringBoot 全局异常拦截捕获处理
一.全局异常处理 //Result定义全局数据返回对象 package com.xiaobing.demo001.domain; public class Result { private Integ ...
- Spring 全局异常捕捉
Spring全局异常捕捉类 注解@ControllerAdvice package com.sicdt.sicsign.web.bill.controller; import org.springfr ...
- Asp.Netcore使用Filter来实现接口的全局异常拦截,以及前置拦截和后置拦截
原文链接:https://blog.csdn.net/qq_38762313/article/details/85234594 全局异常拦截器: 解决写每个接口都需要去做容错而添加try{ ...
- SpringBoot全局异常拦截
SpringBoot全局异常捕获 使用到的技能 @RestControllerAdvice或(@ControllerAdvice+@ResponseBody) @ExceptionHandler 代码 ...
- 返回json格式数据乱码
本文为博主原创,未经允许不得转载: 原本返回json格式数据的代码: @ResponseBody @RequestMapping(value = "getListByTime", ...
- WebService返回json格式数据供苹果或者安卓程序调用
1.新建一个WebService. 2. /// <summary> /// DemoToJson 的摘要说明 /// </summary> [WebService(Names ...
- 使用jQuery发送POST,Ajax请求返回JSON格式数据
问题: 使用jQuery POST提交数据到PHP文件, PHP返回的json_encode后的数组数据,但jQuery接收到的数据不能解析为JSON对象,而是字符串{"code" ...
- Django 1.8.11 查询数据库返回JSON格式数据
Django 1.8.11 查询数据库返回JSON格式数据 和前端交互全部使用JSON,如何将数据库查询结果转换成JSON格式 环境 Win10 Python2.7 Django 1.8.11 返回多 ...
随机推荐
- js寄生组合式继承
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 对Java tutorial-examples中hello2核心代码分析
1.在hello2中有两个.java源文件分别是GreetingServlet.Java和ResponseServlet.jva文件主要对以下核心代码做主要分析. String username = ...
- lsync+rsync 实时同步(ubuntu16.04系统)
1.同步端需要安装 lsync/rsyncapt-get install lsyncd rsync2.生成ssh公钥,粘贴到目标机器里面3.创建配置文件mkdir /etc/lsyncdcat /et ...
- Kafka配置文件及解释
broker.id=0num.network.threads=9num.io.threads=24socket.send.buffer.bytes=102400listeners=PLAINTEXT: ...
- Matlib’s lsqnonlin 和 scipy.optimize’s least_square
matlib's lsqnonlin 和 scipy.optimize's least_square 问题 有三个点 $A,B,C$ , 经过一个线性变换 $T$ , 变为了 $A',B',C'$ 三 ...
- ansible使用指北(二)
前言在上一篇文章里我们了解了ansible的常用模块,今天我们来了解下ansible-playbook,ansbile-playbook是一系统ansible命令的集合,其利用yaml 语言编写,an ...
- 用RecyclerView做一个小清新的Gallery效果 - Ryan Lee的博客
一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...
- K-means真的不能使用曼哈顿距离吗?
问题 说到k-means聚类算法,想必大家已经对它很熟悉了,它是基于距离计算的经典无监督算法,但是有一次在我接受面试时,面试官问了我一个问题:“k-means为什么不能使用曼哈顿距离计算,而使用欧式距 ...
- 网络编程模型(C/S模型和B/S模型)
目录 网络应用编程模型 互联网与企业内部网 早期计算机网络的通信模型 C/S模式 B/S模式 B/S 和 C/S 的区别 网络应用编程模型 互联网与企业内部网 网络的两个含义: 互联网 :互联网(In ...
- IDEA Messages Build总是自动弹出提示错误
IDEA,总是在代码未完成时,在进行切换页面回来后会跳出Messages Build,我相信大家在写java web项目的时候,经常会遇到这个问题,接下来我就和大家说一下问题所在. 主要原因是因为我们 ...