• SpringMvc之Json&全局异常处理


    目录

    一、 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 list

    返回Json对象数组:{

                    msg:“”

                    code:200,

                    data:[ ]

    }

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

    2.1导入pom依赖

    1. <dependency>
    2. <groupId>com.fasterxml.jackson.core</groupId>
    3. <artifactId>jackson-databind</artifactId>
    4. <version>2.9.3</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>com.fasterxml.jackson.core</groupId>
    8. <artifactId>jackson-core</artifactId>
    9. <version>2.9.3</version>
    10. </dependency>
    11. <dependency>
    12. <groupId>com.fasterxml.jackson.core</groupId>
    13. <artifactId>jackson-annotations</artifactId>
    14. <version>2.9.3</version>
    15. </dependency>

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

    1. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    2. <property name="messageConverters">
    3. <list>
    4. <ref bean="mappingJackson2HttpMessageConverter"/>
    5. </list>
    6. </property>
    7. </bean>
    8. <bean id="mappingJackson2HttpMessageConverter"
    9. class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    10. <!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件-->
    11. <property name="supportedMediaTypes">
    12. <list>
    13. <value>text/html;charset=UTF-8</value>
    14. <value>text/json;charset=UTF-8</value>
    15. <value>application/json;charset=UTF-8</value>
    16. </list>
    17. </property>
    18. </bean>

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

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

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

    2.3.1 返回json对象

    1. //返回map
    2. @RequestMapping("/Map")
    3. public Map map(HttpServletRequest Request , Clazz clazz){
    4. PageBean pageBean = new PageBean();
    5. pageBean.setRequest(Request);
    6. //返回[{},{}]
    7. return this.clazzBiz.listMapPager(clazz,pageBean).get(0);
    8. }
    9. //返回T
    10. @RequestMapping("/Clazz")
    11. public Clazz clazz(HttpServletRequest Request , Clazz clazz){
    12. PageBean pageBean = new PageBean();
    13. pageBean.setRequest(Request);
    14. //返回[{},{}]
    15. return this.clazzBiz.listPager(clazz,pageBean).get(0);
    16. }

     2.3.2 返回json数组对象

    1. //返回list<T>
    2. @RequestMapping("/list")
    3. public List<Clazz> list(HttpServletRequest Request , Clazz clazz){
    4. PageBean pageBean = new PageBean();
    5. pageBean.setRequest(Request);
    6. //返回[{},{}]
    7. return this.clazzBiz.listPager(clazz,pageBean);
    8. }
    9. //返回list<map>
    10. @RequestMapping("/listMap")
    11. public List<Map> listMap(HttpServletRequest Request , Clazz clazz){
    12. PageBean pageBean = new PageBean();
    13. pageBean.setRequest(Request);
    14. //返回[{},{}]
    15. return this.clazzBiz.listMapPager(clazz,pageBean);
    16. }

    2.3.3 返回json对象数组

    1. //返回对象数组
    2. @RequestMapping("/hunhe")
    3. public Map hunhe(HttpServletRequest Request , Clazz clazz){
    4. PageBean pageBean = new PageBean();
    5. pageBean.setRequest(Request);
    6. //返回[{},{}]
    7. List<Clazz> list = this.clazzBiz.listPager(clazz,pageBean);
    8. Map map = new HashMap();
    9. map.put("list",list);
    10. map.put("pageBean",pageBean);
    11. return map;
    12. }

    2.4  前端界面编码

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: zjjt
    4. Date: 2022/8/22
    5. Time: 18:47
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <html>
    10. <head>
    11. <title>测试json数据</title>
    12. </head>
    13. <body>
    14. <a href="${pageContext.request.contextPath}/clz/json/list">返回List&lt;T&gt;</a><hr>
    15. <a href="${pageContext.request.contextPath}/clz/json/listMap">返回List&lt;Map&gt;</a><hr>
    16. <a href="${pageContext.request.contextPath}/clz/json/Clazz?cid=1">返回T</a><hr>
    17. <a href="${pageContext.request.contextPath}/clz/json/Map?cid=1">返回Map</a><hr>
    18. <a href="${pageContext.request.contextPath}/clz/json/hunhe">返回混合</a><hr>
    19. </body>
    20. </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.   非全局异常问题处理

    在控制层添加异常代码

    1. //返回list
    2. @RequestMapping("/list")
    3. public List<Clazz> list(HttpServletRequest Request , Clazz clazz){
    4. PageBean pageBean = new PageBean();
    5. pageBean.setRequest(Request);
    6. if (true)
    7. throw new RuntimeException("错误出现在 JsonController.list...");
    8. //返回[{},{}]
    9. return this.clazzBiz.listPager(clazz,pageBean);
    10. }

    在业务层添加异常代码

    1. @Override
    2. public List<Map> listMapPager(Clazz record, PageBean pageBean) {
    3. if (true)
    4. throw new RuntimeException("错误出现在 ClazzBizImpl.mapListPager...");
    5. return clazzMapper.listMapPager(record);
    6. }

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

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

    1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    2. <property name="defaultErrorView" value="error"/>
    3. <property name="exceptionAttribute" value="ex"/>
    4. <property name="exceptionMappings">
    5. <props>
    6. <prop key="java.lang.RuntimeException">errorprop>
    7. props>
    8. property>
    9. bean>

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

    1. <body>
    2. ${ex}
    3. </body>

    5.3  处理结果

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

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

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

    1. public class GlobalException extends RuntimeException {
    2. public GlobalException() {
    3. }
    4. public GlobalException(String message) {
    5. super(message);
    6. }
    7. public GlobalException(String message, Throwable cause) {
    8. super(message, cause);
    9. }
    10. public GlobalException(Throwable cause) {
    11. super(cause);
    12. }
    13. public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
    14. super(message, cause, enableSuppression, writableStackTrace);
    15. }
    16. }

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

    1. @Component
    2. public class GlobalExceptionHandler implements HandlerExceptionResolver {
    3. @Override
    4. public ModelAndView resolveException(HttpServletRequest httpServletRequest,
    5. HttpServletResponse httpServletResponse,
    6. Object o, Exception e) {
    7. ModelAndView mv = new ModelAndView();
    8. mv.setViewName("error");
    9. if (e instanceof GlobalException){
    10. GlobalException globalException = (GlobalException) e;
    11. mv.addObject("ex",globalException.getMessage());
    12. mv.addObject("msg","全局异常....");
    13. }else if (e instanceof RuntimeException){
    14. RuntimeException runtimeException = (RuntimeException) e;
    15. mv.addObject("ex",runtimeException.getMessage());
    16. mv.addObject("msg","运行时异常....");
    17. }
    18. return mv;
    19. }
    20. }

    6.3  在控制层添加异常代码

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

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

    1. @ControllerAdvice
    2. public class GlobalExceptionResolver {
    3. @ExceptionHandler
    4. public ModelAndView handler(Exception e){
    5. ModelAndView mv = new ModelAndView();
    6. mv.setViewName("error");
    7. if (e instanceof GlobalException){
    8. GlobalException globalException = (GlobalException) e;
    9. mv.addObject("ex",globalException.getMessage());
    10. mv.addObject("msg","全局异常....");
    11. }else if (e instanceof RuntimeException){
    12. RuntimeException runtimeException = (RuntimeException) e;
    13. mv.addObject("ex",runtimeException.getMessage());
    14. mv.addObject("msg","运行时异常....");
    15. }
    16. return mv;
    17. }
    18. }

    @ControllerAdvice 和 @ExceptionHandler 的区别

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

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

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

     

    8、全局异常处理JSON返回 

    1. @RestControllerAdvice
    2. public class GlobalExceptionJsonResolver {
    3. @ExceptionHandler
    4. public Map handler(Exception e){
    5. Map map = new HashMap();
    6. if (e instanceof GlobalException){
    7. GlobalException globalException = (GlobalException) e;
    8. map.put("ex",globalException.getMessage());
    9. map.put("msg","全局异常....");
    10. }else if (e instanceof RuntimeException){
    11. RuntimeException runtimeException = (RuntimeException) e;
    12. map.put("ex",runtimeException.getMessage());
    13. map.put("msg","运行时异常....");
    14. }
    15. return map;
    16. }
    17. }

  • 相关阅读:
    C语言中常见的逻辑错误
    Java版的数据结构——栈和队列
    【MySQL】数据库索引入门介绍
    预测编码及例程
    【Hack The Box】linux练习-- Bashed(未完)
    leetcode 17. 电话号码的字母组合
    5、继承与抽象-typescript
    HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(一)
    机器学习的方法总结
    【Java八股40天-Day5】 IO 和 NIO
  • 原文地址:https://blog.csdn.net/m0_67477525/article/details/126468577