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依赖
<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 {@Overridepublic 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@ExceptionHandlerpublic 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只是传递在后端进行判断所用,前端最后展现给客户页面需要我们自己根据逻辑判断异常信息,最终展示不同的前端页面
今天的学习到这里就结束了,感谢各位大大的观看,各位大大的三连是博主更新的动力,感谢谢谢谢谢谢谢谢谢各位的支持!!!!!
相关文章:
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.为什么要全局异常处…...
【第四阶段】kotlin语言的定义类和field关键字学习
1.普通成员变量背后隐士代码 为什么在kotlin中是private 可以直接调用,隐式代码如下 package Kotlin.Stage4class Test54{var name"kotlin"/*背后做的事NotNullprivate String name"kotlin";public void setName(NotNull String name){this.na…...
OpenResty使用漏桶算法实现限流
前言 其它项目组需要调用接口,添加接口限流,防止项目被狂掉宕机。生产用了openresty,所以在openresty上添加按接口限流,同时,需按照不同接口有不同的限流规则,使用openresty中内置的漏桶算法方式限流。 漏…...
Activiti源码跟踪之模型Model操作
Activiti源码跟踪之模型Model操作 模型model设计到的表ACT_RE_MODEL、ACT_GE_BYTEARRAY ACT_RE_MODEL表结构: CREATE TABLE ACT_RE_MODEL (ID_ varchar(64) COLLATE utf8_bin NOT NULL,REV_ int(11) DEFAULT NULL,NAME_ varchar(255) COLLATE utf8_bin DEFAULT N…...
C#-WinForm-发送邮件
登录QQ邮箱——设置——开启“POP3/SMTP服务” 登陆QQ邮箱→打开设置→开启“POP3/SMTP服务”,获取“授权码” 简单总结一下: 1、使用SmtpClient发送电子邮件是很简单的,只要正确创建了MailMessage对象和SmtpClient就可以很容易的发送出去电…...
Springboot整合jdbc和Mybatis
目录 整合jdbc 1. 新建项目 2. 编写yaml配置文件连接数据库 3. 测试类 使用原生的jdbcTemplate进行访问测试 使用Druid连接池 1. 添加类型 2. 初始化连接池 3. 编写config类 配置Druid数据源监视 整合Mybatis 1. 导入依赖 2. 编写mapper接口 3. 编写实体类 4. 编…...
日常生活中的常用命令及操作
目录 一、Windows11 中查看网卡名称 及ip地址 二、查看硬件的详细信息 三、查看显卡声卡详细信息及厂商 四、C盘清理 第一步 输入wini 开启Windows设置主界面 第二步 存储中还有一个叫存储感知的功能 第三步 更改新内容的保存位置 第四步 怕误C盘内的东西可以 查看详细的…...
【C++杂货铺】国庆中秋特辑——多态由浅入深详细总结
文章目录 一、多态的概念二、多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数的重写2.4 虚函数重写的两个例外2.4.1 协变(基类与派生类虚函数返回值类型不同)2.4.2 析构函数的重写(基类与派生类析构函数的名字不同) 2.5 …...
MongoDB基础详解
一、MongoDB概述 MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一…...
解锁前端Vue3宝藏级资料 第五章 Vue 组件应用 4 ( provide 和 inject )
5.5 provide 和 inject 前面的知识告诉我们vue中组件之间传递值需要使用props来完成,但是props也有一定局限性。这个时候在vue3中还有另外的解决方法。那就是使用 provide 和 inject 允许父组件将数据传递给所有后代组件,而不管组件层次结构有多深。你要…...
【List篇】LinkedList 详解
目录 成员变量属性构造方法add(), 插入节点方法remove(), 删除元素方法set(), 修改节点元素方法get(), 取元素方法ArrayList 与 LinkedList的区别Java中的LinkedList是一种实现了List接口的 双向链表数据结构。链表是由一系列 节点(Node)组成的,每个节点包含了指向 上一个…...
推动统一供应链“度量衡”,上汽大通突破传统拥抱SaaS生态
中国汽车市场规模已连续14年位居世界第一,目前占世界汽车份额31%。近年来,物联网、人工智能、电池等技术的快速发展,也为中国从汽车大国逐步迈向汽车强国注入巨大动力。在新一轮的汽车产业变革中,构建一个更智能、更高效协同的供应…...
蓝牙核心规范(V5.4)10.9-BLE 入门笔记之GAP
1.概述 蓝牙核心规范的通用访问配置文件(GAP)部分定义了与设备发现和在两个设备之间建立连接有关的过程。如何执行数据的基本无连接通信、如何使用周期性广播(参见 PADVB-LE Periodic Advertising Broadcast)以及如何设置等时通信(参见 LE BIS和LE CIS - Isochronous Com…...
nginx 配置 ssl
1.1 Nginx如果未开启SSL模块,配置Https时提示错误 原因也很简单,nginx缺少http_ssl_module模块,编译安装的时候带上--with-http_ssl_module配置就行了,但是现在的情况是我的nginx已经安装过了,怎么添加模块࿰…...
家居设计软件Live Home 3D Pro mac中文版特点介绍
Live Home 3D Pro mac是一款专业的3D家居设计软件,可以帮助用户轻松创建和设计家居平面图和3D模型,并进行渲染和虚拟漫游。 Live Home 3D Pro mac软件特点 1. 界面友好:Live Home 3D Pro的界面友好,操作简单方便…...
OkHttp - 现代应用网络的方式
官网:Overview - OkHttp HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP efficiently makes your stuff load faster and saves bandwidth. OkHttp is an HTTP client that’s efficient by default: HTTP/2 s…...
SpringBoot3基础:最简项目示例
说明 本文建立一个最基本的SpringBoot3项目,依赖项仅包含 spring-web(SpringMVC)。 备注:SpringBoot3需要JDK17支持,配置方法参考: SpringBoot3项目中配置JDK17 项目结构图示 POM <?xml version&qu…...
flex:1详解,以及flex:1和flex:auto的区别
什么是flex:1? 在css中,我们经常可以看到这样的写法: .box {display: flex; }.item {flex: 1; }这里的flex:1相当于flex: 1 1 0%,它是一个简写属性,表示项目(flex item)在弹性容器…...
在VMware虚拟机中固定CentOS系统ip(使用桥接模式)
目录 一、前置说明二、前置准备2.1、切换虚拟机网络为桥接模式2.2、查看本机网络信息 三、配置CentOS系统IP3.1、进入系统输入ip addr 查看本机网络配置名称3.2、查看网络配置目录,网络配置文件名称3.3、修改网络配置文件 ifcfg-ens33 固定IP3.4、重启网络 一、前置…...
怎样才能让百度搜索到自己的博客?--九五小庞
怎么把自己的博客推荐到百度、Google等主要搜索引擎? 如果不把你的博客提交到各大搜索引擎中,它们一般是不会收录你的博客的,你可以先尝试一下看看能不能在百度搜到你的博客吧。 如果搜不到的话说明你的博客还没有被百度收录,那么…...
【学习笔记】多模态综述
多模态综述 前言1. CLIP & ViLT2. ALBEF3. VLMO4. BLIP5. CoCa6. BeiTv3总结参考链接 前言 本篇学习笔记虽然是多模态综述,本质上是对ViLT后多模态模型的总结,时间线为2021年至2022年,在这两年,多模态领域的模型也是卷的飞起…...
MLAgents (0) Unity 安装及运行
1、下载ML-Agents 下载地址 GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinfo…...
typename关键字详解(消除歧义)
typename关键字详解 文章目录 typename关键字详解定义用法1.和class同义,用于引入泛型编程中所用到的模板参数2.用来消除歧义,告诉编译器后面的是类型名而不是变量名 定义 typename相当于泛型编程中class的同义关键字,用来指出模板类型所依赖…...
设计模式_解释器模式
解释器模式 案例 角色 1 解释器基类 (BaseInterpreter) 2 具体解释器1 2 3... (Interperter 1 2 3 ) 3 内容 (Context) 4 用户 (user) 流程 (上下文) ---- 传…...
【算法基础】数学知识
质数 质数的判定 866. 试除法判定质数 - AcWing题库 时间复杂度是logN #include<bits/stdc.h> using namespace std; int n; bool isprime(int x) {if(x<2) return false;for(int i2;i<x/i;i){if(x%i0) return false;}return true; } signed main() {cin>&g…...
PDCA循环
目录 1.认识PDCA: 2.PDCA循环的经典案例 3.PDCA的四个阶段和八个步骤 4.PDCA循环的优缺点: 5.案例 6.其他作用 1.认识PDCA: PDCA循环最早由美国质量统计控制之父Shewhat(休哈特)提出的PDS(Plan Do Se…...
Redis 缓存雪崩、缓存穿透、缓存击穿
Redis 是一种常用的内存缓存工具,但在某些情况下,它可能会遭受缓存雪崩、缓存穿透和缓存击穿等问题。下面是一些预防这些问题的建议: 1、缓存雪崩 缓存雪崩指的是在某个时间点上,大量的缓存数据同时失效或过期,导致大…...
Android Media3 ExoPlayer 开启缓存功能
ExoPlayer 开启播放缓存功能,在下次加载已经播放过的网络资源的时候,可以直接从本地缓存加载,实现为用户节省流量和提升加载效率的作用。 方法一:采用 ExoPlayer 缓存策略 第 1 步:实现 Exoplayer 参考 Exoplayer 官…...
MyBatis注解开发
MyBatis常用注解 注解对应XML说明Insert< insert>新增SQLUpdate< update>更新SQLDelete< delete>删除SQLSelect< select>查询SQLParam–参数映射Results< resultMap>结果映射Result< id>< result>字段映射 开发流程: 1…...
C# Onnx Yolov8 Cls 分类
效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…...
国内餐饮类网站欣赏/色盲测试图 考驾照
文章目录题目解题代码题目 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m n,这样它就有足够的空间…...
网站开发给网站设置图标在什么文件中写代码/全网整合营销推广方案
明确人生的目的和意义 在经营十二条中,第一条就是“明确事业的目的意义”,做企业如果不能明确事业的目的和意义,那就没有办法办的长久,也没有办法聚拢人心,企业就会像一盘散沙。 人生也是一样的,如果不能明…...
做健身推广网站/优化网站视频
FTP(是一种文件传输协议)是一种非常广泛使用的网络协议,用来在网络中传输文件,FTP以明文传送用户认证信息,存在被网络窃听的危险。 在openssh软件包中,包含了一个成为SFTP(Secure FTP)的安全文件传输子系统…...
如何展示网站操作流程/长尾关键词
编辑:ll ASE65R330-ASEMI高压N沟道MOS管ASE65R330 型号:ASE65R330 品牌:ASEMI 封装:TO-220F 最大漏源电流:12.5A 漏源击穿电压:650V RDS(ON)Max:0.33mΩ 引脚数量…...
室内设计用什么软件比较好/培训如何优化网站
上一篇教程我们讲述了怎么使用Python连接CoppeliaSim对里面的无人机进行控制,也讲述了怎么通过多进程的方式进行调用。在大多数情况下学会这些手段就足够进行仿真操作,可将仿真的重点转到算法的验证上,然而对于群体无人机算法的验证则是个例外。 这类算法的验证往往需要对一…...
网站开发接口/优化网站找哪家
对自有品牌而言,寻找到靠谱且性价比高的制造商是成功的关键,如果你还不知道该如何寻找这样的制造商,那么建议你收藏本文以便参考。一、寻找供应商注意事项要使你的自有品牌理念变成现实,你得找到靠谱的供应商并与他们建立合作关系…...