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


    目录

    一.SpringMVC的JSON数据返回

    1.导入Maven依赖

    2.配置spring-mvc.xml

    3.@ResponseBody注解的使用

    3.1案例演示

    1.List集合转JSON

     2.Map集合转JSON

     3.返回指定格式String

    4. @ResponseBody用法

     5.Jackson

    5.1介绍

    5.2常用注解

    二.异常处理机制 

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

    2.异常处理思路

    3.SpringMVC异常分类

    4.案例演示

    4.1 异常处理方式一:配置springmvc提供的简单异常处理器

     4.2 异常处理方式二:全局异常处理,通过实现HandlerExceptionResolver异常处理解析器完成异常处理

    (1)首先在异常包中定义一个全局异常类

    (2) 定义一个全局异常处理的类

     4.3 异常处理方式三:通过注解的方式将异常信息直接以JSON的格式回显到前端


    一.SpringMVC的JSON数据返回

    1.导入Maven依赖

    1. <dependency>
    2. <groupId>com.fasterxml.jackson.coregroupId>
    3. <artifactId>jackson-databindartifactId>
    4. <version>2.9.3version>
    5. dependency>
    6. <dependency>
    7. <groupId>com.fasterxml.jackson.coregroupId>
    8. <artifactId>jackson-coreartifactId>
    9. <version>2.9.3version>
    10. dependency>
    11. <dependency>
    12. <groupId>com.fasterxml.jackson.coregroupId>
    13. <artifactId>jackson-annotationsartifactId>
    14. <version>2.9.3version>
    15. dependency>

    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. <property name="supportedMediaTypes">
    11. <list>
    12. <value>text/html;charset=UTF-8value>
    13. <value>text/json;charset=UTF-8value>
    14. <value>application/json;charset=UTF-8value>
    15. list>
    16. property>
    17. bean>

    3.@ResponseBody注解的使用

    @ResponseBody注解的作用:

    用于标记控制器方法的返回值应该作为 HTTP 响应的主体部分返回,而不是通过视图解析器进行渲染。

    当使用 Spring MVC 框架时,控制器方法通常会返回某种类型的数据(例如对象、集合、字符串等),然后由视图解析器将该数据绑定到视图模板并生成最终的 HTML 或其他格式的响应。然而,有时候我们希望直接返回数据而不经过视图解析器的处理,将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。

    在这种情况下,我们可以使用 @ResponseBody 注解来标记控制器方法。当该注解应用于方法时,Spring MVC 框架会将方法的返回值封装为适当的格式(例如 JSON),并将其作为 HTTP 响应的主体部分返回给客户端。这样可以方便地实现 RESTful API 服务,将数据直接以特定格式响应给调用端。

    注意:在使用此注解之后不会再走视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

    3.1案例演示

    1.List集合转JSON

    这里我们定义一个返回List集合的方法,最终到Controller层中标注@ResponseBody注解将集合数据转换成JSON数据

    1. /**
    2. * 返回List
    3. * @param req
    4. * @param hBook
    5. * @return
    6. */
    7. @ResponseBody
    8. @RequestMapping("/list")
    9. public List list(HttpServletRequest req, HBook hBook){
    10. PageBean pageBean = new PageBean();
    11. pageBean.setRequest(req);
    12. List lst = this.hBookbiz.listPager(hBook, pageBean);
    13. return lst;
    14. }

    测试结果: 

     2.Map集合转JSON

    我们定义一个返回Map集合的方法,通过Controller中注解@ResponseBody,返回JSON格式数据

    1. /**
    2. * 返回List
    3. * @param req
    4. * @param hBook
    5. * @return
    6. */
    7. @ResponseBody
    8. @RequestMapping("/mapList")
    9. public List mapList(HttpServletRequest req, HBook hBook){
    10. PageBean pageBean = new PageBean();
    11. pageBean.setRequest(req);
    12. List lst = this.hBookbiz.mapListPager(hBook, pageBean);
    13. return lst;
    14. }

    测试结果

     3.返回指定格式String
    1. @ResponseBody
    2. @RequestMapping("/jsonStr")
    3. public String jsonStr(HttpServletRequest req, HBook hBook){
    4. return "bookEdit";
    5. }

    测试结果 

    4. @ResponseBody用法

    在整个Controller类中可将注解定义在类对象上面,这样整个类中的方法都使用了注解@ResponseBody

     小结:由上面的案例得知,我们将对象、集合、字符串等类型数据,通过Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。

     5.Jackson

    5.1介绍

    Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。

    特点

    • 容易使用,提供了高层次外观,简化常用的用例。

    • 无需创建映射,API提供了默认的映射大部分对象序列化。

    • 性能高,快速,低内存占用

    • 创建干净的json

    • 不依赖其他库

    • 代码开源

    5.2常用注解

    注解说明
    @JsonIgnore作用在字段或方法上,用来完全忽略被注解的字段和方法对应的属性
    @JsonProperty作用在字段或方法上,用来对属性的序列化/反序列化,可以用来避免遗漏属性,同时提供对属性名称重命名
    @JsonIgnoreProperties作用在类上,用来说明有些属性在序列化/反序列化时需要忽略掉
    @JsonUnwrapped作用在属性字段或方法上,用来将子JSON对象的属性添加到封闭的JSON对象
    @JsonFormat指定序列化日期/时间值时的格式

    二.异常处理机制 

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

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

    2.异常处理思路

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

    3.SpringMVC异常分类

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

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

    • 使用@ControllerAdvice + @ExceptionHandler

    4.案例演示

    4.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>

    error 获取定义的异常处理的页面

    ex存储异常处理的异常信息 

    我们在controller层造出一个异常,在前端页面打印异常信息,并显示前端页面

    1. @ResponseBody
    2. @RequestMapping("/mapList")
    3. public List mapList(HttpServletRequest req, HBook hBook){
    4. PageBean pageBean = new PageBean();
    5. pageBean.setRequest(req);
    6. List lst = this.hBookbiz.mapListPager(hBook, pageBean);
    7. System.out.println(1/0);
    8. return lst;
    9. }
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Titletitle>
    5. head>
    6. <body>
    7. 错误信息页面
    8. <hr>
    9. ${ex}
    10. <hr>
    11. ${msg}
    12. body>
    13. html>

    测试结果

     4.2 异常处理方式二:全局异常处理,通过实现HandlerExceptionResolver异常处理解析器完成异常处理

     
    
    (1)首先在异常包中定义一个全局异常类

    1. package com.YU.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. }
    (2) 定义一个全局异常处理的类

    它通过实现了HandlerExceptionResolver接口,同时使用了@Component注解,以被Spring框架管理和注册为一个组件。

    这个异常处理器的主要作用是在Spring MVC应用程序中捕获并处理全局异常。当一个Controller方法抛出异常时,Spring MVC会将异常传递给注册的异常处理器来处理该异常,并跳转异常页面,通过判断异常类型,然后携带不同的异常信息传递到前端页面展示

    1. package com.YU.component;
    2. import com.YU.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. @Component
    9. public class GlobalExceptionHandler implements HandlerExceptionResolver {
    10. @Override
    11. public ModelAndView resolveException(HttpServletRequest httpServletRequest,
    12. HttpServletResponse httpServletResponse,
    13. Object o, 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. }else{
    25. mv.addObject("ex",e.getMessage());
    26. mv.addObject("msg","其他异常....");
    27. }
    28. return mv;
    29. }
    30. }

    通过这种方式,你可以统一处理全局的异常情况,并在异常发生时返回指定的错误视图,并且还可以根据不同的异常类型提供不同的错误信息,以便更好地提供错误处理和用户体验

    测试结果

    注意:前面两种异常处理不可同时使用,不然第二种会被覆盖并不产生效果 

     4.3 异常处理方式三:通过注解的方式将异常信息直接以JSON的格式回显到前端

    与前面两种不同的是,方式三使用注解@ResponseBody 和@ExceptionHandler,通过判断异常类型,将异常信息传递到map集合进行保存,并将其转换成JSON格式的数据传输到前端展示

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

    测试结果

     总结:

    在SpringMVC中三种方法的使用的优先级依次降低,但是在实际开发过程中第三种应用范围最广,也就是我们最常用的类型,当然JSON只是传递在后端进行判断所用,前端最后展现给客户页面需要我们自己根据逻辑判断异常信息,最终展示不同的前端页面

     今天的学习到这里就结束了,感谢各位大大的观看,各位大大的三连是博主更新的动力,感谢谢谢谢谢谢谢谢谢各位的支持!!!!! 

  • 相关阅读:
    论文笔记 - PRISM: A Rich Class of Parameterized Submodular Information Measures for Guided Subset Selection
    新手如何备考学习PMP?
    序设计·RB(AT&T汇编)_笔记_第10章:处理字符串
    延时队列DelayQueue
    Redis-主从复制是怎么实现的
    docker镜像(第二天)
    Hadoop安装2
    Redis:2023年的必修课,不学就要被市场淘汰
    Redis Key操作
    Vue 3 中的 Composition API 详解
  • 原文地址:https://blog.csdn.net/weixin_73320743/article/details/132852139