目录

一、 SpringMvc框架对Json数据的支持

1.    Json数据的格式分类:

2.  SpringMvc框架如何产生上述三种json格式数据

2.1导入pom依赖

2.2  在Springmvc框架配置文件中配置做json数据转换的适配器

2.3  添加responseBody、restController注解  能够将json数据返回

2.4  前端界面编码

2.5 返回json数据结果

二、全局异常的处理

1.  为什么要全局处理异常

2.   异常处理思路

3.   SpringMVC异常分类

4.   非全局异常问题处理

5、使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;

5.1在Springmvc框架配置文件中配置处理器

5.2  建立一个前端异常显示界面 error

5.3  处理结果

6、通过HandlerExceptionResovler接口实现全局异常

6.1  建立一个全局异常处理类并实现运行异常类

6.2  建立异常处理器 实现HandlerExceptionResovler接口

6.3  在控制层添加异常代码

7.   使用@ControllerAdvice+@ExceptionHandler实现全局异常

8、全局异常处理JSON返回


一、 SpringMvc框架对Json数据的支持

1.    Json数据的格式分类:

返回Json对象:T  Map

返回Json数组:list<T> list<Map>

返回Json对象数组:{

msg:“”

code:200,

data:[ ]

}

2.  SpringMvc框架如何产生上述三种json格式数据

2.1导入pom依赖

 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.3</version></dependency>

2.2  在Springmvc框架配置文件中配置做json数据转换的适配器

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><ref bean="mappingJackson2HttpMessageConverter"/></list></property></bean><bean id="mappingJackson2HttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件--><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>text/json;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property></bean>

2.3  添加responseBody、restController注解  能够将json数据返回

在项目中如果全部返回json格式数据就用restController:responseBody+controller = restController

在项目中如果返回json格式数据与跳转页面同时存在,就在返回json格式的方法上添加responseBody注解,在类上添加controller

2.3.1 返回json对象

  //返回map@RequestMapping("/Map")public Map map(HttpServletRequest Request , Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(Request);//返回[{},{}]return this.clazzBiz.listMapPager(clazz,pageBean).get(0);}//返回T@RequestMapping("/Clazz")public Clazz clazz(HttpServletRequest Request , Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(Request);//返回[{},{}]return this.clazzBiz.listPager(clazz,pageBean).get(0);}

2.3.2 返回json数组对象

  //返回list<T>@RequestMapping("/list")public List<Clazz> list(HttpServletRequest Request , Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(Request);//返回[{},{}]return this.clazzBiz.listPager(clazz,pageBean);}//返回list<map>@RequestMapping("/listMap")public List<Map> listMap(HttpServletRequest Request , Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(Request);//返回[{},{}]return this.clazzBiz.listMapPager(clazz,pageBean);}

2.3.3 返回json对象数组

//返回对象数组@RequestMapping("/hunhe")public Map hunhe(HttpServletRequest Request , Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(Request);//返回[{},{}]List<Clazz> list = this.clazzBiz.listPager(clazz,pageBean);Map map = new HashMap();map.put("list",list);map.put("pageBean",pageBean);return map;}

2.4  前端界面编码

<%--Created by IntelliJ IDEA.User: zjjtDate: 2022/8/22Time: 18:47To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>测试json数据</title>
</head>
<body><a href="${pageContext.request.contextPath}/clz/json/list">返回List&lt;T&gt;</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/listMap">返回List&lt;Map&gt;</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/Clazz?cid=1">返回T</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/Map?cid=1">返回Map</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/hunhe">返回混合</a><hr>
</body>
</html>

2.5 返回json数据结果

返回对象:

返回数组对象:

返回对象数组:

二、全局异常的处理

1.  为什么要全局处理异常

我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。

2.   异常处理思路

系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

3.   SpringMVC异常分类

1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;

2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;

3)使用@ControllerAdvice + @ExceptionHandler

4.   非全局异常问题处理

在控制层添加异常代码

  //返回list<T>@RequestMapping("/list")public List<Clazz> list(HttpServletRequest Request , Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(Request);if (true)throw new RuntimeException("错误出现在 JsonController.list...");//返回[{},{}]return this.clazzBiz.listPager(clazz,pageBean);}

在业务层添加异常代码

 @Overridepublic List<Map> listMapPager(Clazz record, PageBean pageBean) {if (true)throw new RuntimeException("错误出现在 ClazzBizImpl.mapListPager...");return clazzMapper.listMapPager(record);}

5、使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;

5.1在Springmvc框架配置文件中配置处理器

<!-- springmvc提供的简单异常处理器 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- 定义默认的异常处理页面 --><property name="defaultErrorView" value="error"/><!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --><property name="exceptionAttribute" value="ex"/><!-- 定义需要特殊处理的异常,这是重要点 --><property name="exceptionMappings"><props><prop key="java.lang.RuntimeException">error</prop></props><!-- 还可以定义其他的自定义异常 --></property></bean>

5.2  建立一个前端异常显示界面 error

<body>
${ex}
</body>

5.3  处理结果

6、通过HandlerExceptionResovler接口实现全局异常

先将配置文件中的处理器注释掉

6.1  建立一个全局异常处理类并实现运行异常类

public class GlobalException extends RuntimeException {public GlobalException() {}public GlobalException(String message) {super(message);}public GlobalException(String message, Throwable cause) {super(message, cause);}public GlobalException(Throwable cause) {super(cause);}public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}

6.2  建立异常处理器 实现HandlerExceptionResovler接口

@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object o, Exception e) {ModelAndView mv = new ModelAndView();mv.setViewName("error");if (e instanceof GlobalException){GlobalException globalException = (GlobalException) e;mv.addObject("ex",globalException.getMessage());mv.addObject("msg","全局异常....");}else if (e instanceof RuntimeException){RuntimeException runtimeException = (RuntimeException) e;mv.addObject("ex",runtimeException.getMessage());mv.addObject("msg","运行时异常....");}return mv;}
}

6.3  在控制层添加异常代码

  //返回T@RequestMapping("/Clazz")public Clazz clazz(HttpServletRequest Request , Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(Request);if (true)throw new GlobalException("错误出现在 JsonController.load...");//返回[{},{}]return this.clazzBiz.listPager(clazz,pageBean).get(0);}

7.   使用@ControllerAdvice+@ExceptionHandler实现全局异常

@ControllerAdvice
public class GlobalExceptionResolver {@ExceptionHandlerpublic ModelAndView handler(Exception e){ModelAndView mv = new ModelAndView();mv.setViewName("error");if (e instanceof GlobalException){GlobalException globalException = (GlobalException) e;mv.addObject("ex",globalException.getMessage());mv.addObject("msg","全局异常....");}else if (e instanceof RuntimeException){RuntimeException runtimeException = (RuntimeException) e;mv.addObject("ex",runtimeException.getMessage());mv.addObject("msg","运行时异常....");}return mv;}
}

@ControllerAdvice 和 @ExceptionHandler 的区别

  • ExceptionHandler, 方法注解, 作用于 Controller 级别. ExceptionHandler 注解为一个 Controler 定义一个异常处理器.

  • ControllerAdvice, 类注解, 作用于 整个 Spring 工程. ControllerAdvice 注解定义了一个全局的异常处理器.

需要注意的是, ExceptionHandler 的优先级比 ControllerAdvice 高, 即 Controller 抛出的异常如果既可以让 ExceptionHandler 标注的方法处理, 又可以让 ControllerAdvice 标注的类中的方法处理, 则优先让 ExceptionHandler 标注的方法处理.

8、全局异常处理JSON返回

@RestControllerAdvice
public class GlobalExceptionJsonResolver {@ExceptionHandlerpublic Map handler(Exception e){Map map = new HashMap();if (e instanceof GlobalException){GlobalException globalException = (GlobalException) e;map.put("ex",globalException.getMessage());map.put("msg","全局异常....");}else if (e instanceof RuntimeException){RuntimeException runtimeException = (RuntimeException) e;map.put("ex",runtimeException.getMessage());map.put("msg","运行时异常....");}return map;}
}

SpringMvc之Json全局异常处理相关推荐

  1. springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON

    springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON 参考文章: (1)springmvc全局异常处理ControllerAdvice区分返回响应类型是页面 ...

  2. SpringMVC之JSON和全局异常处理

    目录 一.json解析 json的形式 SpringMVC框架如何产生上述三种形式的数据? 1.导入pom依赖             Jackson 2.配置SpringMVC.xml 配置适配器 ...

  3. 从零开始学习springmvc(5)——Spring国际化和全局异常处理

    [项目地址] 从零开始学习springmvc 如果觉得有用可以关注一下公众号:码字不易,求赞求关注 五.Spring国际化和全局异常处理 五.Spring国际化和全局异常处理 5.1 国际化介绍 5. ...

  4. springmvc高级(拦截器,全局异常处理,文件上传)

    SpringMVC 1.文件上传 文件上传: 指的就是将用户本地计算机中文件上传到服务器上的过程称之为文件上传 1).文件上传编程步骤 # 1.项目中引入相关依赖 <dependency> ...

  5. 希望你永远不懂JSON和全局异常处理

    目录 一,json解析 二,全局异常处理的3种形式 三,json统一处理 一,json解析 json的形式: {}->json对象    T Map []-> json数组    List ...

  6. JSON和几个的全局异常处理

    目录 一.SpringMVC对JSON的支持 1.json的各种场景 二.SpringMVC的全局异常处理的3种形式 1.非全局异常处理问题演示 ① 为什么要全局异常处理 ② 异常处理思路 ③ Spr ...

  7. SpringMVC 全局异常处理的简单应用

    2019独角兽企业重金招聘Python工程师标准>>> 在SpringMVC框架的项目开发过程中,你还在使用 try{} catch(){} 输出异常吗?,那样你就真的OUT了,Sp ...

  8. 别再写满屏的try-catch了,真丑,全局异常处理不会吗?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:巨人大哥 www.cnblogs.com/juren ...

  9. 你这代码写得真丑,满屏的try-catch,全局异常处理不会吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 背景 软件开发过程中,不可避免的是需要处理各种异常,就我自己来 ...

最新文章

  1. chrome浏览器不能录音:Uncaught TypeError: Cannot read property ‘getUserMedia‘ of undefined解决方法
  2. 适合pythonpandas的软件_适合 Python 入门的 8 款强大工具!
  3. 无法从外部连接MySQL_MySQL不能从外部 连接的解决方法
  4. linux终端中使用ctrl+c和ctrl+v
  5. Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?
  6. IIS日志存入数据库之二:ETW
  7. 多台电脑之间共享键盘鼠标
  8. ipv6正则表达式 java_正则表达式,匹配所有有效格式的IPv6地址
  9. 超级蓝筹股是什么意思?a股蓝筹股是什么意思?
  10. html多个span平均分布各行,往div里面加100个span 每10个换行 换行怎么换啊
  11. Cortex-M3概述
  12. [论坛专贴]关于接口
  13. 家政服务app软件开发
  14. EndNote自动生成毕业论文GB7714引文格式教程
  15. EXPLAIN 使用
  16. AMD CPU 电脑突然画面声音突然卡顿,卡碟声,画面撕裂
  17. 如何在Chrome浏览器下清除DNS缓存
  18. 证券行情全市场推送解决方案
  19. r5 6600h怎么样 相当于什么水平
  20. IDEA全局 查找/搜索 代码里所有 中文/汉字 或指定的 中文/汉字

热门文章

  1. P2345 [USACO04OPEN]MooFest G
  2. 购买虚拟服务器费用是办公费吗,T+费用单能做报销之类的么?是不是要自己添加例如办公费,差旅费什么的。老板想要在APP上查看库存,销售情况是不是要购买订阅报销,订阅报销怎么收费?...
  3. 虚拟驾驶环境搭建(一)
  4. 网游原来可以这样玩,你见过吗?
  5. SnowNlp中文分词和中文关键词提取只能提取单个字不能提取分词的解决方法
  6. 数据库篇(数据库设计) ---权限系统设计
  7. python plot label_python - matplotlib子图的通用xlabel / ylabel
  8. 企业级管理软件快速开发平台技术白皮书
  9. Codeforces Round #774 (Div. 2) A~C
  10. 论德国人的计划取向意识