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

news2025/1/18 13:56:00

目录

一.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依赖

<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.配置spring-mvc.xml

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

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数据

/**
     * 返回List<T>
     * @param req
     * @param hBook
     * @return
     */
    @ResponseBody
    @RequestMapping("/list")
    public List<HBook> list(HttpServletRequest req, HBook hBook){
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<HBook> lst = this.hBookbiz.listPager(hBook, pageBean);
        return lst;
    }

测试结果: 

 2.Map集合转JSON

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

/**
     * 返回List<Map>
     * @param req
     * @param hBook
     * @return
     */
    @ResponseBody
    @RequestMapping("/mapList")
    public List<Map> mapList(HttpServletRequest req, HBook hBook){
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<Map> lst = this.hBookbiz.mapListPager(hBook, pageBean);
        return lst;
    }

测试结果

 3.返回指定格式String

@ResponseBody
    @RequestMapping("/jsonStr")
    public String jsonStr(HttpServletRequest req, HBook hBook){
        return "bookEdit";
    }

测试结果 

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提供的简单异常处理器

<!-- 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>

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

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

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

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

测试结果

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

 

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

package com.YU.exception;

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);
    }
}

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

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

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

package com.YU.component;

import com.YU.exception.GlobalException;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {
    @Override
    public 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","运行时异常....");
        }else{
            mv.addObject("ex",e.getMessage());
            mv.addObject("msg","其他异常....");
        }
        return mv;
    }
}

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

测试结果

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

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

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

@ControllerAdvice
public class GlobalExceptionHandler{

    @ResponseBody
    @ExceptionHandler
    public 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","运行时异常....");
        }else {
            map.put("ex",e.getMessage());
            map.put("msg","其它异常....");
        }
        return map;
    }
}

测试结果

 总结:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1007936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

$ref赋值之后,子组件不渲染(刷新后,$ref父组件传值,子组件不更新数据问题)

在父组件中&#xff0c;点击搜索&#xff0c; 通过this.$refs传值给子组件 this.$refs.GoodsClassNav.paramsAll.keyword key; 子组件结果中不显示&#xff0c; 但是打印this.$refs.GoodsClassNav.paramsAll.keyword&#xff0c;可以打印到最新的值&#xff0c;点击子组件中…

SpringCloud在idea中一键启动项目

1、如下图文件中加上&#xff1a; <component name"RunDashboard"><option name"configurationTypes"><set><option value"SpringBootApplicationConfigurationType" /></set></option></component>…

CS5817规格书|CS5817芯片参数|多功能便携式显示器方案芯片规格

CS5817支持最高4K 60Hz是集睿致远&#xff08;ASL&#xff09; 新推出的多功能显示控制器芯片&#xff0c;CS5817产品可应用于便携显示器、电竞显示器、桌面显示器、一体式台式机和嵌入式显示系统。 Type-C/DP/HDMI2.0输入转LVDS/eDP/VBO 芯片, 高度集成了多种输入输出接口, 并…

QtCharts详细介绍及其使用

QtCharts模块 QtCharts是Qt框架中的一个模块&#xff0c;用于创建各种图表和数据可视化。它提供了一组功能强大且易于使用的类&#xff0c;使开发人员能够轻松地在应用程序中添加各种交互式图表。 QtCharts模块支持多种常见类型的图表&#xff0c;包括折线图、柱状图、饼图、…

浅谈C++|STL之set篇

一.set 1.1set基本概念 特点&#xff1a; 所有元素在插入时&#xff0c;会自动排序&#xff0c;并且不能插入重复元素。 本质&#xff1a; set/multiset属于关联式容器&#xff0c;底层是红黑树。 set/multiset区别 1.set不允许容器中有重复的元素 2.multiset允许容器中有重复…

FFmpeg入门及编译

文章目录 前言一、FFmpeg 简介二、基本组成1、封装模块 - AVFormat2、编解码模块 - AVCodec3、滤镜模块 - AVFilter4、视频图像转换计算模块 - swscale5、音频转换计算模块 - swresample6、AVUtil - 核心工具库7、AVDevice - 硬件采集&#xff0c;加速&#xff0c;显示 三、命令…

教学必备工具

大家好&#xff0c;今天要给大家介绍一个超级方便的工具——易查分&#xff01;利用易查分&#xff0c;我们可以轻松制作一个便捷高效的作业查询系统&#xff0c;让作业查询变得简单又高效。下面就让我来为大家详细介绍一下易查分的使用教程吧&#xff01; 是不是想有个自己的分…

【Java】-【使用jxl操作excel】

文章目录 下载jxl包并引用基本使用多sheet页使用并与MySQL/Oracle数据库连接 报错excel文件读写报错&#xff1a;jxl.read.biff.BiffException: Unable to recognize OLE stream原因&#xff1a;文件版本不兼容&#xff0c;jxl只支持excecl03版解决办法 下载jxl包并引用 jxl.j…

【1++的C++进阶】之C++11(二)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C进阶】 文章目录 一&#xff0c;类的新变化二&#xff0c;可变参数模板三&#xff0c;lambda表达式 一&#xff0c;类的新变化 在C03之前&#xff0c;我们的默认成员函数有6个&#xff0c;…

(2596. 检查骑士巡视方案leetcode,经典深搜)-------------------Java实现

&#xff08;2596. 检查骑士巡视方案leetcode,经典深搜&#xff09;-------------------Java实现 题目表述 骑士在一张 n x n 的棋盘上巡视。在 有效 的巡视方案中&#xff0c;骑士会从棋盘的 左上角 出发&#xff0c;并且访问棋盘上的每个格子 恰好一次 。 给你一个 n x n …

PY32F003F18之定时器中断

PY32F003F18定时器有TIM1&#xff0c;TIM3&#xff0c;TIM14&#xff0c;TIM16和TIM17。其中TIM1为高级定时器&#xff0c;其它为通用定时器。见下表&#xff1a; 一、PY32F003F18定时器的工作模式&#xff1a; 1、边沿对齐模式 计数器工作在"边沿对齐模式" 设置&q…

《动手学深度学习 Pytorch版》 4.7 前向传播、反向传播和计算图

4.7.1 前向传播 整节理论&#xff0c;详见书本。 4.7.2 前向传播计算图 整节理论&#xff0c;详见书本。 4.7.3 反向传播 整节理论&#xff0c;详见书本。 4.7.4 训练神经网络 整节理论&#xff0c;详见书本。 练习 &#xff08;1&#xff09;假设一些标量函数 X X X…

Wireshark把DDoS照原形

1 前言 MTU、 传输速度、 拥塞控制&#xff0c;还是各种重传&#xff0c;TCP传输相关的核心概念&#xff1a; 学习了RFC规范和具体的Linux实现通过案例&#xff0c;把这些知识灵活运用了起来 这种种还是在协议规范这大框架内的讨论&#xff0c;默认前提就是通信两端是遵照TC…

Activating More Pixels in Image Super-Resolution Transformer(HAT)超分

摘要 基于Transformer的方法在低级视觉任务&#xff08;如图像超分辨率&#xff09;上表现出令人印象深刻的性能。然而&#xff0c;我们发现这些网络只能通过归因分析利用有限的输入信息空间范围。这意味着Transformer的潜力在现有网络中仍未得到充分利用。为了激活更多输入像…

yolov7添加 iRMB模块

复制过来 yolo.py添加 yaml文件随便换&#xff0c;建议换3x3的 pip install timm0.6.5&#xff0c;版本问题记得搞一下

DNG格式详解,DNG是什么?为何DNG可以取代RAW统一单反相机、苹果安卓移动端相机拍摄输出原始图像数据标准

返回图像处理总目录&#xff1a;《JavaCV图像处理合集总目录》 前言 在DNG格式发布之前&#xff0c;我们先了解一下之前单反相机、苹果和安卓移动端相机拍照输出未经处理的原始图像格式是什么&#xff1f; RAW 什么是RAW&#xff1f; RAW是未经处理、也未经压缩的格式。可以…

基于开源模型搭建实时人脸识别系统(六):人脸识别(人脸特征提取)

文章目录 人脸识别的几个发展阶段基于深度学习的人脸识别技术的流程闭集和开集&#xff08;Open set&#xff09;识别人脸识别的损失Insightface人脸识别数据集模型选型参考文献结语人脸识别系统项目源码 前面我们讲过了人脸检测、人脸质量、人脸关键点、人脸跟踪&#xff0c;接…

微分中值定理

目录 费马定理 罗尔定理 拉格朗日中值定理 柯西中值定理 几个常用的泰勒公式 微分中值定理是微积分中的一个重要定理&#xff0c;它用于描述一个函数在某个区间内的平均变化率与该区间内某一点的瞬时变化率之间的关系。微分中值定理有两个主要形式&#xff1a;拉格朗日中值…

Kotlin Files Paths write ByteArray writeString写多行BufferedWriter

Kotlin Files Paths write ByteArray writeString写多行BufferedWriter import java.nio.file.Files import java.nio.file.Paths import java.nio.file.StandardOpenOptionfun main(args: Array<String>) {val filePath "./myfile.txt"val path Paths.get(…

【报错】springboot3启动报错

报错内容&#xff1a;Cannot load driver class: org.h2.Driver Error starting ApplicationContext. To display the condition evaluation report re-run your application with debug enabled. 解决; 通过源码分析&#xff0c;druid-spring-boot-3-starter目前最新版本是1…