• SpringMVC之JSON数据返回及异常处理机制


    目录

    一.JSON数据的返回

    二.异常处理机制

      2.1 异常处理方式一

    2.2 异常处理方式二

    2.3 异常处理方式三


    一.JSON数据的返回

            JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于Web应用程序和服务之间的数据传输。通过使用JSON,数据可以以一种结构化的方式进行组织和存储,并可以方便地在不同的编程语言和平台之间进行解析和使用。

            1.1 要想使用JSON,首先老规矩先导入pom.xml依赖

    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>

                1.2    接着就是spring-mvc.xml文件

    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>

        1.3.@ResponseBody注解

            我们使用json技术转换时,要先来了解这个注解:@ResponseBody注解的作用是将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。注意:在使用此注解之后不会再走视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

            1.4 基础入门

               接下来,分别写几个方法,来返回不同的返回值分别是返回一个对象,一个数组,返回对象数组,返回JSON字符串.

            在这些方法上面都用到了@ResponseBody注解,如果这整个类里面的方法都是JSON格式的话就可以不需要在每一个方法上面写注解,而是可以在类上面打一个注解就好,

    1. package com.yinzi.web;
    2. /**
    3. * @author yinzi
    4. * @create 2023-09-13 14:06
    5. */
    6. import com.yinzi.Biz.StrutsBiz;
    7. import com.yinzi.model.Struts;
    8. import com.yinzi.util.PageBean;
    9. import org.springframework.beans.factory.annotation.Autowired;
    10. import org.springframework.stereotype.Controller;
    11. import org.springframework.web.bind.annotation.RequestMapping;
    12. import org.springframework.web.bind.annotation.ResponseBody;
    13. import org.springframework.web.bind.annotation.RestController;
    14. import javax.servlet.http.HttpServletRequest;
    15. import java.util.HashMap;
    16. import java.util.List;
    17. import java.util.Map;
    18. /*@ResponseBody
    19. @Controller 这两个可以用下面这个代替*/
    20. @RestController
    21. @RequestMapping("/struts/json")
    22. public class JsonController {
    23. @Autowired
    24. private StrutsBiz StrutsBiz;
    25. /**
    26. * 返回List
    27. */
    28. /* @ResponseBody*/
    29. @RequestMapping("/list")
    30. public List<Struts> list(HttpServletRequest req, Struts struts){
    31. PageBean pageBean = new PageBean();
    32. pageBean.setRequest(req);
    33. List<Struts> lst = this.StrutsBiz.selectList(struts,pageBean);
    34. return lst;
    35. }
    36. /**
    37. * 返回T
    38. * @param req
    39. * @return
    40. */
    41. /* @ResponseBody*/
    42. @RequestMapping("/load")
    43. public Struts load(HttpServletRequest req, Struts struts){
    44. if(struts.getCid() != null){
    45. List<Struts> lst = this.StrutsBiz.selectList(struts, null);
    46. return lst.get(0);
    47. }
    48. return null;
    49. }
    50. /**
    51. * 返回List
    52. * @param req
    53. * @return
    54. */
    55. /* @ResponseBody*/
    56. @RequestMapping("/mapList")
    57. public List<Map> mapList(HttpServletRequest req, Struts clazz){
    58. PageBean pageBean = new PageBean();
    59. pageBean.setRequest(req);
    60. List<Map> lst = this.StrutsBiz.mapList(clazz, pageBean);
    61. return lst;
    62. }
    63. /**
    64. * 返回Map
    65. * @param req
    66. * @return
    67. */
    68. /* @ResponseBody*/
    69. @RequestMapping("/mapLoad")
    70. public Map mapLoad(HttpServletRequest req, Struts struts){
    71. if(struts.getCid() != null){
    72. List<Map> lst = this.StrutsBiz.mapList(struts, null);
    73. return lst.get(0);
    74. }
    75. return null;
    76. }
    77. /* @ResponseBody*/
    78. @RequestMapping("/all")
    79. public Map all(HttpServletRequest req, Struts struts){
    80. PageBean pageBean = new PageBean();
    81. pageBean.setRequest(req);
    82. List<Struts> lst = this.StrutsBiz.selectList(struts, pageBean);
    83. Map map = new HashMap();
    84. map.put("lst",lst);
    85. map.put("pageBean",pageBean);
    86. return map;
    87. }
    88. /* @ResponseBody*/
    89. @RequestMapping("/jsonStr")
    90. public String jsonStr(HttpServletRequest req, Struts struts){
    91. return "clzEdit";//返回字符串
    92. }
    93. }

            1.5 结果测试

            大家可以看到输入框中的路径的变化,调用了不同的方法

            1.6 @JsonIgnore注解使用

            如果我们要隐藏属性不被看到的话就可以把这个注解放在属性的上面

    可以和上方动图比较,有了这个注解,页面上就不会显示  pic  这个属性了 

    二.异常处理机制

            全局异常处理指的是在应用程序的运行过程中,捕获和处理未被明确捕获的异常。它的目的是在发生异常时,能够提供一个统一的处理方式,以保证应用程序的稳定性和可靠性。

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

            2.1 异常处理方式一

            改变spring-mvc配置文件

    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>

             error.jsp界面

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. </head>
    6. <body>
    7. 错误❌信息页面
    8. ${ex}
    9. </body>
    10. </html>

    接着创建一个错误,以演示 

    结果:

     

    2.2 异常处理方式二

    1.通过instanceof判断异常类型
    2.通过设置mv.setView(new MappingJackson2JsonView())方式返回JSON数据

    建立一个全局异常的类

    1. package com.yinzi.Component;
    2. import com.yinzi.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. * @author yinzi
    10. * @create 2023-09-13 16:28
    11. */
    12. @Component
    13. public class GlobalExceptionHandler implements HandlerExceptionResolver {
    14. @Override
    15. public ModelAndView resolveException(HttpServletRequest httpServletRequest,
    16. HttpServletResponse httpServletResponse,
    17. Object o, Exception e) {
    18. ModelAndView mv = new ModelAndView();
    19. mv.setViewName("error");
    20. if (e instanceof GlobalException){//全局异常
    21. GlobalException globalException = (GlobalException) e;
    22. mv.addObject("ex",globalException.getMessage());
    23. mv.addObject("msg","全局异常....");
    24. }else if (e instanceof RuntimeException){//运行异常
    25. RuntimeException runtimeException = (RuntimeException) e;
    26. mv.addObject("ex",runtimeException.getMessage());
    27. mv.addObject("msg","运行时异常....");
    28. }else{
    29. mv.addObject("ex",e.getMessage());
    30. mv.addObject("msg","其它异常....");
    31. }
    32. return mv;
    33. }
    34. }

            在方法中调用

            结果:

    2.3 异常处理方式三

    建立异常类

    1. package com.yinzi.Component;
    2. import com.yinzi.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 java.util.HashMap;
    7. import java.util.Map;
    8. @ControllerAdvice
    9. public class GlobalExceptionResolver {
    10. // 跳转错误页面
    11. // @ExceptionHandler
    12. // public ModelAndView handler(Exception e){
    13. // ModelAndView mv = new ModelAndView();
    14. // mv.setViewName("error");
    15. // if (e instanceof GlobalException){
    16. // GlobalException globalException = (GlobalException) e;
    17. // mv.addObject("ex",globalException.getMessage());
    18. // mv.addObject("msg","全局异常....");
    19. // }else if (e instanceof RuntimeException){
    20. // RuntimeException runtimeException = (RuntimeException) e;
    21. // mv.addObject("ex",runtimeException.getMessage());
    22. // mv.addObject("msg","运行时异常....");
    23. // }
    24. // return mv;
    25. // }
    26. // 返回错误json数据
    27. @ResponseBody
    28. @ExceptionHandler
    29. public Map handler(Exception e){
    30. Map map = new HashMap();
    31. if (e instanceof GlobalException){
    32. GlobalException globalException = (GlobalException) e;
    33. map.put("ex",globalException.getMessage());
    34. map.put("msg","全局异常....");
    35. }else if (e instanceof RuntimeException){
    36. RuntimeException runtimeException = (RuntimeException) e;
    37. map.put("ex",runtimeException.getMessage());
    38. map.put("msg","运行时异常....");
    39. }else {
    40. map.put("ex",e.getMessage());
    41. map.put("msg","其它异常....");
    42. }
    43. return map;
    44. }
    45. }

    结果:

    返回的是json数据,而不是页面,如果打开上面的就是返回页面

            今天的分享就到这啦!!

  • 相关阅读:
    亚马逊运营纯干货:如何引流?亚马逊站外引流最全讲解
    1、Nio三大组件(channel-buffer)
    面试官:你先回去等通知吧!这个 Java 岗位我还有机会吗?
    了不起的爸爸
    数据结构前瞻
    终于有人把数据架构讲明白了
    Google Earth Engine(GEE)分析多个地区的植被覆盖趋势
    SpringCloud——服务注册——Zookeeper
    机器学习:在SAS中运行随机森林
    Kafka多生产者消费者自动配置
  • 原文地址:https://blog.csdn.net/YZZdear/article/details/132849055