• SpringMVC之JSON返回&异常处理机制


    一.什么是SpringMVC之JSON返回&异常处理机制

    二.Json处理

    导入pom.xml依赖

     导入Spring-Mvc.xml

    编写JsonController

    编写Sql语句

    测试结果 

    json转换的注解 

     测试结果(@JsonIgnore)

    三.全局异常处理机制  

    为什么要全局异常处理

    异常处理思路

    ​编辑 

    自写一个错误代码

    ​编辑 输出结果

    异常处理方式(一)

    新建一个erreo.jsp

     输出结果

    异常处理(二)

    编写GlobalException类

     编写全局异常处理类GlobalExceptionHandler

    在error.jsp中编写

    在JsonController类编写异常

    测试结果

    ​编辑 异常处理(三)

    编写GlobalExceptionResolver类

    测试结果

    重新编写GlobalExceptionResolver类

    测试结果


    一.什么是SpringMVC之JSON返回&异常处理机制

    SpringMVC是一个Web框架,它提供了许多方便的特性,其中之一就是JSON返回和异常处理机制

    JSON返回指的是,当客户端向服务器发起请求时,服务器可以返回JSON格式的响应数据。这是非常常见的一种情况,特别是在前后端分离的开发模式中,后端通常会返回JSON格式的数据。

    SpringMVC提供了多种方式来实现JSON返回,其中最简单的方式是使用@ResponseBody注解,这个注解可以将Controller方法返回的对象自动转换成JSON格式的数据,然后响应给客户端。如果需要更加灵活的JSON格式化方式,可以使用Jackson或者FastJSON等库进行定制化配置。

    异常处理机制指的是当服务器出现异常时,SpringMVC提供了一套通用的异常处理机制,可以统一处理异常,返回友好的错误信息给客户端。在SpringMVC中,异常处理主要分为两种方式,一种是基于@ControllerAdvice注解的全局异常处理方式,另一种是基于@ExceptionHandler注解的局部异常处理方式。通过这两种方式,我们可以针对不同的异常类型进行不同的处理,比如返回特定的错误码、错误信息等。这样可以提高系统的容错性和可靠性。

    二.Json处理

    导入pom.xml依赖
    1. "1.0" encoding="UTF-8"?>
    2. "http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. 4.0.0
    5. org.example
    6. xyzy
    7. 1.0-SNAPSHOT
    8. war
    9. xyzy Maven Webapp
    10. http://www.example.com
    11. UTF-8
    12. 1.8
    13. 1.8
    14. 3.7.0
    15. 5.0.2.RELEASE
    16. 3.4.5
    17. 5.1.44
    18. 5.1.2
    19. 1.3.1
    20. 2.1.1
    21. 2.4.3
    22. 2.9.1
    23. 3.2.0
    24. 1.7.13
    25. 4.12
    26. 4.0.0
    27. 1.18.2
    28. 1.1.0
    29. 2.10.0
    30. 2.9.0
    31. 1.7.1.RELEASE
    32. 2.9.3
    33. 1.2
    34. 1.1.2
    35. 8.0.47
    36. 1.3.3
    37. 5.0.2.Final
    38. 1.3.2
    39. org.springframework
    40. spring-core
    41. ${spring.version}
    42. org.springframework
    43. spring-beans
    44. ${spring.version}
    45. org.springframework
    46. spring-context
    47. ${spring.version}
    48. org.springframework
    49. spring-orm
    50. ${spring.version}
    51. org.springframework
    52. spring-tx
    53. ${spring.version}
    54. org.springframework
    55. spring-aspects
    56. ${spring.version}
    57. org.springframework
    58. spring-web
    59. ${spring.version}
    60. org.springframework
    61. spring-test
    62. ${spring.version}
    63. org.mybatis
    64. mybatis
    65. ${mybatis.version}
    66. mysql
    67. mysql-connector-java
    68. ${mysql.version}
    69. com.github.pagehelper
    70. pagehelper
    71. ${pagehelper.version}
    72. org.mybatis
    73. mybatis-spring
    74. ${mybatis.spring.version}
    75. org.springframework
    76. spring-context-support
    77. ${spring.version}
    78. org.mybatis.caches
    79. mybatis-ehcache
    80. ${mybatis.ehcache.version}
    81. net.sf.ehcache
    82. ehcache
    83. ${ehcache.version}
    84. redis.clients
    85. jedis
    86. ${redis.version}
    87. org.springframework.data
    88. spring-data-redis
    89. ${redis.spring.version}
    90. com.fasterxml.jackson.core
    91. jackson-databind
    92. ${jackson.version}
    93. com.fasterxml.jackson.core
    94. jackson-core
    95. ${jackson.version}
    96. com.fasterxml.jackson.core
    97. jackson-annotations
    98. ${jackson.version}
    99. org.apache.commons
    100. commons-dbcp2
    101. ${commons.dbcp2.version}
    102. commons-pool2
    103. org.apache.commons
    104. org.apache.commons
    105. commons-pool2
    106. ${commons.pool2.version}
    107. org.springframework
    108. spring-webmvc
    109. ${spring.version}
    110. org.slf4j
    111. slf4j-api
    112. ${slf4j.version}
    113. org.slf4j
    114. jcl-over-slf4j
    115. ${slf4j.version}
    116. runtime
    117. org.apache.logging.log4j
    118. log4j-api
    119. ${log4j2.version}
    120. org.apache.logging.log4j
    121. log4j-core
    122. ${log4j2.version}
    123. org.apache.logging.log4j
    124. log4j-slf4j-impl
    125. ${log4j2.version}
    126. org.apache.logging.log4j
    127. log4j-web
    128. ${log4j2.version}
    129. runtime
    130. com.lmax
    131. disruptor
    132. ${log4j2.disruptor.version}
    133. junit
    134. junit
    135. ${junit.version}
    136. javax.servlet
    137. javax.servlet-api
    138. ${servlet.version}
    139. provided
    140. org.projectlombok
    141. lombok
    142. ${lombok.version}
    143. provided
    144. jstl
    145. jstl
    146. ${jstl.version}
    147. taglibs
    148. standard
    149. ${standard.version}
    150. org.apache.tomcat
    151. tomcat-jsp-api
    152. ${tomcat-jsp-api.version}
    153. commons-fileupload
    154. commons-fileupload
    155. ${commons-fileupload.version}
    156. org.hibernate
    157. hibernate-validator
    158. ${hibernate-validator.version}
    159. org.apache.shiro
    160. shiro-core
    161. ${shiro.version}
    162. org.apache.shiro
    163. shiro-web
    164. ${shiro.version}
    165. org.apache.shiro
    166. shiro-spring
    167. ${shiro.version}
    168. xyzy
    169. src/main/java
    170. **/*.xml
    171. src/main/resources
    172. *.properties
    173. *.xml
    174. org.apache.maven.plugins
    175. maven-compiler-plugin
    176. ${maven.compiler.plugin.version}
    177. ${maven.compiler.source}
    178. ${maven.compiler.target}
    179. ${project.build.sourceEncoding}
    180. org.mybatis.generator
    181. mybatis-generator-maven-plugin
    182. 1.3.2
    183. mysql
    184. mysql-connector-java
    185. ${mysql.version}
    186. true
    187. maven-clean-plugin
    188. 3.1.0
    189. maven-resources-plugin
    190. 3.0.2
    191. maven-compiler-plugin
    192. 3.8.0
    193. maven-surefire-plugin
    194. 2.22.1
    195. maven-war-plugin
    196. 3.2.2
    197. maven-install-plugin
    198. 2.5.2
    199. maven-deploy-plugin
    200. 2.8.2
     导入Spring-Mvc.xml
    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xmlns:mvc="http://www.springframework.org/schema/mvc"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
    9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    10. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    11. package="com.xy"/>
    12. "org.springframework.web.servlet.view.InternalResourceViewResolver">
    13. "viewClass"
    14. value="org.springframework.web.servlet.view.JstlView">
    15. "prefix" value="/WEB-INF/jsp/"/>
    16. "suffix" value=".jsp"/>
    17. "/static/" mapping="/static/**"/>
    18. "multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    19. "defaultEncoding" value="UTF-8">
    20. "maxUploadSize" value="52428800">
    21. "resolveLazily" value="true"/>
    22. "com.xy.interceptor.LoginInterceptor">
    23. "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    24. "messageConverters">
    25. "mappingJackson2HttpMessageConverter"/>
    26. "mappingJackson2HttpMessageConverter"
    27. class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    28. "supportedMediaTypes">
    29. text/html;charset=UTF-8
    30. text/json;charset=UTF-8
    31. application/json;charset=UTF-8
    编写JsonController
    1. package com.xy.web;
    2. import com.xy.biz.hpjyBiz;
    3. import com.xy.biz.hpjyBiz;
    4. import com.xy.model.hpjy;
    5. import com.xy.utils.PageBean;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Controller;
    8. import org.springframework.web.bind.annotation.RequestMapping;
    9. import org.springframework.web.bind.annotation.ResponseBody;
    10. import org.springframework.web.bind.annotation.RestController;
    11. import javax.servlet.http.HttpServletRequest;
    12. import java.util.HashMap;
    13. import java.util.List;
    14. import java.util.Map;
    15. /**
    16. * @author小李飞刀
    17. * @site www.javaxl.com
    18. * @company xxx公司
    19. * @create  2022-08-17 9:41
    20. */
    21. //@ResponseBody
    22. //@Controller
    23. @RestController
    24. @RequestMapping("/hpjy/json")
    25. public class JsonController {
    26. @Autowired
    27. private hpjyBiz hpjyBiz;
    28. /**
    29. * 返回List
    30. * @param req
    31. * @param hpjy
    32. * @return
    33. */
    34. // @ResponseBody
    35. @RequestMapping("/list")
    36. public List list(HttpServletRequest req, hpjy hpjy){
    37. PageBean pageBean = new PageBean();
    38. pageBean.setRequest(req);
    39. List lst = this.hpjyBiz.listPager(hpjy, pageBean);
    40. return lst;
    41. }
    42. /**
    43. * 返回T
    44. * @param req
    45. * @param hpjy
    46. * @return
    47. */
    48. // @ResponseBody
    49. @RequestMapping("/load")
    50. public hpjy load(HttpServletRequest req, hpjy hpjy){
    51. if(hpjy.getId() != null){
    52. List lst = this.hpjyBiz.listPager(hpjy, null);
    53. return lst.get(0);
    54. }
    55. return null;
    56. }
    57. /**
    58. * 返回List
    59. * @param req
    60. * @param hpjy
    61. * @return
    62. */
    63. // @ResponseBody
    64. @RequestMapping("/mapList")
    65. public List mapList(HttpServletRequest req, hpjy hpjy){
    66. PageBean pageBean = new PageBean();
    67. pageBean.setRequest(req);
    68. List lst = this.hpjyBiz.mapListPager(hpjy, pageBean);
    69. return lst;
    70. }
    71. /**
    72. * 返回Map
    73. * @param req
    74. * @param hpjy
    75. * @return
    76. */
    77. // @ResponseBody
    78. @RequestMapping("/mapLoad")
    79. public Map mapLoad(HttpServletRequest req, hpjy hpjy){
    80. if(hpjy.getId() != null){
    81. List lst = this.hpjyBiz.mapListPager(hpjy, null);
    82. return lst.get(0);
    83. }
    84. return null;
    85. }
    86. // @ResponseBody
    87. @RequestMapping("/all")
    88. public Map all(HttpServletRequest req, hpjy hpjy){
    89. PageBean pageBean = new PageBean();
    90. pageBean.setRequest(req);
    91. List lst = this.hpjyBiz.listPager(hpjy, pageBean);
    92. Map map = new HashMap();
    93. map.put("lst",lst);
    94. map.put("pageBean",pageBean);
    95. return map;
    96. }
    97. // @ResponseBody
    98. @RequestMapping("/jsonStr")
    99. public String jsonStr(HttpServletRequest req, hpjy hpjy){
    100. return "hpjyEdit";
    101. }
    102. }
    编写Sql语句

    测试结果 

     

    //    @ResponseBody
        @RequestMapping("/load")
        public hpjy load(HttpServletRequest req, hpjy hpjy){
            if(hpjy.getId() != null){
                List lst = this.hpjyBiz.listPager(hpjy, null);
                return lst.get(0);
            }
            return null;
        }
    测试结果如下:

      /**
         * 返回List
         * @param req
         * @param hpjy
         * @return
         */
    //    @ResponseBody
        @RequestMapping("/mapList")
        public List mapList(HttpServletRequest req, hpjy hpjy){
            PageBean pageBean = new PageBean();
            pageBean.setRequest(req);
            List lst = hpjyBiz.mapListPager(hpjy, pageBean);
            return lst;
        }
    

    测试结果如下:

     

     

     /**
         * 返回Map
         * @param req
         * @param hpjy
         * @return
         */
    //    @ResponseBody
        @RequestMapping("/mapLoad")
        public Map mapLoad(HttpServletRequest req, hpjy hpjy){
            if(hpjy.getId() != null){
                List lst = this.hpjyBiz.mapListPager(hpjy, null);
                return lst.get(0);
            }
            return null;
        }
    

    测试结果如下:

     

     

    //    @ResponseBody
        @RequestMapping("/all")
        public Map all(HttpServletRequest req, hpjy hpjy){
            PageBean pageBean = new PageBean();
            pageBean.setRequest(req);
            List lst = this.hpjyBiz.listPager(hpjy, pageBean);
            Map map = new HashMap();
            map.put("lst",lst);
            map.put("pageBean",pageBean);
            return map;
        }

    测试结果如下:

    //    @ResponseBody
        @RequestMapping("/jsonStr")
        public String jsonStr(HttpServletRequest req, hpjy hpjy){
            return "hpjyEdit";
        }
    测试结果如下:
    

    json转换的注解 
     测试结果(@JsonIgnore)

    (注:隐藏想要隐藏的)

    三.全局异常处理机制  

    为什么要全局异常处理

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

    异常处理思路
     
    自写一个错误代码

     输出结果

    异常处理方式(一)

    在Spring-Mvc.xml中写异常处理方式

    新建一个erreo.jsp

    (注:获取异常的xx)

     输出结果

    异常处理(二)
    编写GlobalException类
    1. package com.xy.exception;
    2. public class GlobalException extends RuntimeException {
    3. public GlobalException() {
    4. }
    5. public GlobalException(String message) {
    6. super(message);
    7. }
    8. public GlobalException(String message, Throwable cause) {
    9. super(message, cause);
    10. }
    11. public GlobalException(Throwable cause) {
    12. super(cause);
    13. }
    14. public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
    15. super(message, cause, enableSuppression, writableStackTrace);
    16. }
    17. }
     编写全局异常处理类GlobalExceptionHandler
    1. package com.xy.component;
    2. import com.xy.exception.GlobalException;
    3. import org.springframework.stereotype.Component;
    4. import org.springframework.web.servlet.HandlerExceptionResolver;
    5. import org.springframework.web.servlet.ModelAndView;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. //全局异常处理类
    9. @Component
    10. public class GlobalExceptionHandler implements HandlerExceptionResolver {
    11. @Override
    12. public ModelAndView resolveException(HttpServletRequest httpServletRequest,
    13. HttpServletResponse httpServletResponse,
    14. Object o, Exception e) {
    15. ModelAndView mv = new ModelAndView();
    16. mv.setViewName("error");
    17. if (e instanceof GlobalException){
    18. GlobalException globalException = (GlobalException) e;
    19. mv.addObject("ex",globalException.getMessage());
    20. mv.addObject("msg","全局异常....");
    21. }else if (e instanceof RuntimeException){
    22. RuntimeException runtimeException = (RuntimeException) e;
    23. mv.addObject("ex",runtimeException.getMessage());
    24. mv.addObject("msg","运行时异常....");
    25. }else {
    26. mv.addObject("ex",e.getMessage());
    27. mv.addObject("msg","其他异常....");
    28. }
    29. return mv;
    30. }
    31. }
    在error.jsp中编写

    在JsonController类编写异常

     

    测试结果
     异常处理(三)
    编写GlobalExceptionResolver类
    1. package com.xy.component;
    2. import com.xy.exception.GlobalException;
    3. import org.springframework.web.bind.annotation.ControllerAdvice;
    4. import org.springframework.web.bind.annotation.ExceptionHandler;
    5. import org.springframework.web.bind.annotation.ResponseBody;
    6. import org.springframework.web.servlet.ModelAndView;
    7. import java.util.HashMap;
    8. import java.util.Map;
    9. @ControllerAdvice
    10. public class GlobalExceptionResolver {
    11. // 返回错误json数据
    12. @ResponseBody
    13. @ExceptionHandler
    14. public Map handler(Exception e){
    15. Map map = new HashMap();
    16. if (e instanceof GlobalException){
    17. GlobalException globalException = (GlobalException) e;
    18. map.put("ex",globalException.getMessage());
    19. map.put("msg","全局异常....");
    20. }else if (e instanceof RuntimeException){
    21. RuntimeException runtimeException = (RuntimeException) e;
    22. map.put("ex",runtimeException.getMessage());
    23. map.put("msg","运行时异常....");
    24. }else {
    25. map.put("ex",e.getMessage());
    26. map.put("msg","其它异常....");
    27. }
    28. return map;
    29. }
    测试结果

    重新编写GlobalExceptionResolver类
    1. package com.xy.component;
    2. import com.xy.exception.GlobalException;
    3. import org.springframework.web.bind.annotation.ControllerAdvice;
    4. import org.springframework.web.bind.annotation.ExceptionHandler;
    5. import org.springframework.web.bind.annotation.ResponseBody;
    6. import org.springframework.web.servlet.ModelAndView;
    7. import java.util.HashMap;
    8. import java.util.Map;
    9. @ControllerAdvice
    10. public class GlobalExceptionResolver {
    11. // 跳转错误页面
    12. @ExceptionHandler
    13. public ModelAndView handler(Exception e) {
    14. ModelAndView mv = new ModelAndView();
    15. mv.setViewName("error");
    16. if (e instanceof GlobalException) {
    17. GlobalException globalException = (GlobalException) e;
    18. mv.addObject("ex", globalException.getMessage());
    19. mv.addObject("msg", "全局异常....");
    20. } else if (e instanceof RuntimeException) {
    21. RuntimeException runtimeException = (RuntimeException) e;
    22. mv.addObject("ex", runtimeException.getMessage());
    23. mv.addObject("msg", "运行时异常....");
    24. }
    25. return mv;
    26. }
    测试结果

  • 相关阅读:
    java基于安卓Android微信小程序的天文观星系统 uniapp
    网页html产生随机MAC地址
    Java的设计模式基本概念及使用场景
    Linux CentOS 系统安装
    前端工程化(vue脚手架安装)
    使用element的小弹框并修改css
    [ Azure | Az-900 ] 基础知识点总结(三) - Azure 管理和治理
    react-activation缓存React.lazy异步组件问题记录
    Codeforces Round #804 (Div. 2)-C. The Third Problem
    Android Gradle插件与Gradle的区别
  • 原文地址:https://blog.csdn.net/2201_75455485/article/details/132852047