SpringMVC系列(六)之JSON数据返回以及异常处理机制
目录
前言
一. JSON概述
二. JSON数据返回
1. 导入pom依赖
2. 添加配置文件(spring-mvc.xml)
3. @ResponseBody注解使用
4. 效果展示
5. Jackson介绍
三. 全局异常处理
1. 为什么要全局异常处理
2. 异常处理思路
3. 异常处理方式一
4. 异常处理方式二
5. 异常处理方式三
前言
Spring MVC 在传递数据时,通常都需要对数据的类型和格式进行转换。而这些数据不仅可以是常见的 String 类型,还可以是 JSON 等其他类型。
JSON 是近些年一种比较流行的数据格式,它与 XML 相似,也是用来存储数据的。但相较于 XML,JSON 数据占用的空间更小,解析速度更快。因此,使用 JSON 数据进行前后台的数据交互也是一种十分常见的手段。
另外,在实际的应用开发中,经常会不可避免地遇到各种可预知的、不可预知的异常,此时我们就需要对这些异常处理,以保证程序正常运行。
本篇将对 Spring MVC 的 JSON 类型数据返回以及异常处理进行分享。
一. JSON概述
JSON(JavaScript Object Notation,JS 对象标记)是一种轻量级的数据交互格式。与 XML 一样,JSON 也是一种基于纯文本的数据格式。通过它,我们不仅能够传递 String、Number、Boolean 等简单类型的数据,还可以传递数组、Object 对象等复杂类型的数据。
二. JSON数据返回
Spring MVC 为我们提供了两个十分重要的与 JSON 格式转换相关的注解,它们分别是 @RequestBody 和 @ResponseBody。
注解 | 位置 | 说明 |
---|---|---|
@RequestBody | 方法的形参上 | 该注解用于将请求体中的数据绑定到控制器方法的形参上。 |
@ResponseBody | 方法上 | 该注解用于将控制器方法的返回值,直接作为响应报文的响应体响应到 浏览器上。 |
这里以 @ResponseBody为例
JSON 支持对象结构,数组结构,对象和数组组合成的复杂结构
1. 导入pom依赖
<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注解的作用是将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON
数据或者是XML数据。
注意:在使用此注解之后不会再走视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
controller层
package com.xissl.web;import com.xissl.biz.clazzBiz;
import com.xissl.model.clazz;
import com.xissl.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Controller
@RequestMapping("/clz/json")
public class JsonController {@Autowiredprivate clazzBiz clazzBiz;/*** 返回List<T>* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/list")public List<clazz> list(HttpServletRequest req, clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<clazz> lst = this.clazzBiz.listPager(clazz, pageBean);return lst;}/*** 返回T* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/load")public clazz load(HttpServletRequest req, clazz clazz){if(clazz.getCid() != null){List<clazz> lst = this.clazzBiz.listPager(clazz, null);return lst.get(0);}return null;}/*** 返回List<Map>* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/mapList")public List<Map> mapList(HttpServletRequest req, clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Map> lst = this.clazzBiz.mapListPager(clazz, pageBean);return lst;}/*** 返回Map* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/mapLoad")public Map mapLoad(HttpServletRequest req, clazz clazz){if(clazz.getCid() != null){List<Map> lst = this.clazzBiz.mapListPager(clazz, null);return lst.get(0);}return null;}@ResponseBody@RequestMapping("/all")public Map all(HttpServletRequest req, clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<clazz> lst = this.clazzBiz.listPager(clazz, pageBean);Map map = new HashMap();map.put("lst",lst);map.put("pageBean",pageBean);return map;}@ResponseBody@RequestMapping("/jsonStr")public String jsonStr(HttpServletRequest req, clazz clazz){return "clzEdit";}}
业务逻辑层
List<Map> mapListPager(clazz clazz, PageBean pageBean);
@Overridepublic List<Map> mapListPager(clazz clazz, PageBean pageBean) {return clazzMapper.mapListPager(cl
mapper接口
List<Map> mapListPager(clazz clazz);
sql映射文件
<select id="mapListPager" resultType="java.util.Map" parameterType="com.xissl.model.clazz" >select<include refid="Base_Column_List" />from t_struts_class<where><if test="cname != null">and cname like concat('%',#{cname},'%')</if></where></select>
4. 效果展示
对象结构
JSON 的对象结构以“{”开始,以“}”结束,中间则由 0 个或多个以英文的逗号(即“,”)分隔的 key/value 对构成。(实体或集合T/map)
数组结构
JSON 的数组结构以“[”开始、以“]”结束,中间部分由 0 个或多个以英文的逗号(即“,”)分隔的值列表组成。(List<T>/List<map>)
混合结构
JSON数据返回第一种方式是在方法上添加@ResponseBody注解。
除此之外还可以将@ResponseBody注解放于类上。
以及第三种方式,将@Controller与@ResponseBody合并,即@RestController
5. Jackson介绍
Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。
特点
-
容易使用,提供了高层次外观,简化常用的用例。
-
无需创建映射,API提供了默认的映射大部分对象序列化。
-
性能高,快速,低内存占用
-
创建干净的json
-
不依赖其他库
-
代码开源
常用注解
注解 | 说明 |
---|---|
@JsonIgnore | 作用在字段或方法上,用来完全忽略被注解的字段和方法对应的属性 |
@JsonProperty | 作用在字段或方法上,用来对属性的序列化/反序列化,可以用来避免遗漏属性,同时提供对属性名称重命名 |
@JsonIgnoreProperties | 作用在类上,用来说明有些属性在序列化/反序列化时需要忽略掉 |
@JsonUnwrapped | 作用在属性字段或方法上,用来将子JSON对象的属性添加到封闭的JSON对象 |
@JsonFormat | 指定序列化日期/时间值时的格式 |
三. 全局异常处理
1. 为什么要全局异常处理
我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。
2. 异常处理思路
系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。
3. 异常处理方式一
SpringMVC中自带了一个异常处理器叫SimpleMappingExceptionResolver,该处理器实现了HandlerExceptionResolver 接口,全局异常处理器都需要实现该接口。
在配置文件(spring-mvc.xml)中添加异常处理器
<!-- 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>
添加一个异常代码
@ResponseBody@RequestMapping("/list")public List<clazz> list(HttpServletRequest req, clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<clazz> lst = this.clazzBiz.listPager(clazz, pageBean);System.out.println(1 / 0);return lst;}
异常处理界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
出错咯......
${ex}
</body>
</html>
测试效果:
4. 异常处理方式二
package com.xissl.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);}
}
1.通过instanceof判断异常类型
2.通过设置mv.setView(new MappingJackson2JsonView())方式返回JSON数据
package com.xissl.component;import com.xissl.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;}
}
@ResponseBody@RequestMapping("/jsonStr")public String jsonStr(HttpServletRequest req, clazz clazz){if(true)throw new GlobalException("又出错咯......");return "clzEdit";}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
出错咯......
${ex}
<br>
${msg}
</body>
</html>
5. 异常处理方式三
package com.xissl.component;import com.xissl.exception.GlobalException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.Map;@ControllerAdvice
public class GlobalExceptionResolver {// 返回错误json数据@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;}
}
这段代码运行后展示的效果是JSON形式的异常信息
package com.xissl.component;import com.xissl.exception.GlobalException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;import java.util.HashMap;
import java.util.Map;@ControllerAdvice
public class GlobalExceptionResolver {// 跳转错误页面@ExceptionHandlerpublic ModelAndView handler(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","运行时异常....");}return mv;}}
这段代码运行后展示的效果是jsp界面的异常信息
相关文章:

SpringMVC系列(六)之JSON数据返回以及异常处理机制
目录 前言 一. JSON概述 二. JSON数据返回 1. 导入pom依赖 2. 添加配置文件(spring-mvc.xml) 3. ResponseBody注解使用 4. 效果展示 5. Jackson介绍 三. 全局异常处理 1. 为什么要全局异常处理 2. 异常处理思路 3. 异常处理方式一 4. 异常处…...
民安智库(北京第三方窗口测评)开展汽车消费者焦点小组座谈会调查
民安智库近日开展了一场汽车消费者焦点小组座谈会,旨在深入了解目标消费者对汽车功能的需求和消费习惯,为汽车企业提供有针对性的解决方案。 在焦点小组座谈会中,民安智库公司(第三方市容环境指数测评)邀请了一群具有…...

【CVPR2021】MVDNet论文阅读分析与总结
Challenge: 现有的目标检测器主要融合激光雷达和相机,通常提供丰富和冗余的视觉信息 利用最先进的成像雷达,其分辨率比RadarNet和LiRaNet中使用的分辨率要细得多,提出了一种有效的深度后期融合方法来结合雷达和激光雷达信号。 MV…...

IDEA指定Maven settings file文件未生效
背景:在自己电脑上配置的时候,由于公司项目和我自己的项目的Maven仓库不一致,我就在项目中指定了各自的Maven配置文件。但是我发现公司的项目私有仓库地址IDEA总是识别不到! 俩个配置文件分别是: /Users/sml/Mine/研发…...
swift UI 和UIKIT 如何配合使用
SwiftUI和UIKit可以在同一个iOS应用程序中配合使用。它们是两个不同的用户界面框架,各自有自己的优势和特点。在现实开发中,很多iOS应用程序并不是一开始就完全采用SwiftUI或UIKit,而是根据需要逐步引入SwiftUI或者使用两者共存。 SwiftUI的…...
c语言练习题55:IP 地址⽆效化
IP 地址⽆效化 题⽬描述: 给你⼀个有效的 IPv4 地址 address ,返回这个 IP 地址的⽆效化版本。 所谓⽆效化 IP 地址,其实就是⽤ "[.]" 代替了每个 "."。 • ⽰例 1: 输⼊:address "1.1.1.…...
nvidia-persistenced 常驻
本文地址:blog.lucien.ink/archives/542 发现每次执行 nvidia-smi 都特别慢,发现是需要 nvidia-persistenced 常驻才可以,这个并不会在安装完驱动之后自动配置,需要手动设置一个自启。 cat <<EOF >> /etc/systemd/sy…...
leetcode 42, 58, 14(*)
42. Trapping Rain Water 1.暴力解法(未通过) class Solution { public:int trap(vector<int>& height) {int n height.size();int res 0;for(int i0; i<n; i){int r_max 0, l_max 0;for(int j i; j<n; j)r_max max(r_max, heigh…...

SpringCloud-微服务CAP原则
接上文 SpringCloud-Config配置中心 到此部分即微服务的入门。 总的来说,数据存放的节点数越多,分区容忍性就越高,但要复制更新的次数就越多,一致性就越难保证。同时为了保证一致性,更新所有节点数据所需要的时间就…...

K8S:Yaml文件详解
目录 一.Yaml文件详解 1.Yaml文件格式 2.YAML 语法格式 二.Yaml文件编写及相关概念 1.查看 api 资源版本标签 2.yaml编写案例 (2)Deployment类型编写nginx服务 (3)k8s集群中的port介绍 (5)快速编写yaml文件 …...

机器人连续位姿同步插值轨迹规划—对数四元数、b样条曲线、c2连续位姿同步规划
简介:Smooth orientation planning is benefificial for the working performance and service life of industrial robots, keeping robots from violent impacts and shocks caused by discontinuous orientation planning. Nevertheless, the popular used quate…...

三维模型3DTile格式轻量化压缩的遇到常见问题与处理方法分析
三维模型3DTile格式轻量化压缩的遇到常见问题与处理方法分析 三维模型的轻量化压缩是一项技术挑战,特别是在处理复杂的3DTile格式时。下面列举了一些处理过程中可能遇到的常见问题以及相应的处理方法: 模型精度损失:在进行压缩处理时&#x…...

2023-简单点-开启防火墙后,ping显示请求超时;windows共享盘挂在不上
情景描述 树莓派 挂载 windows共享盘 之前一直可以,突然有一天不行了 ping xxxx不通了 一查,或许是服务器被同事开了防火墙,默认关闭了ping的回显 操作: 开启ping回显cmd ping通了,但是挂载还是不行, 显示 dmesg命…...
华为Java工程师面试题
常见问题: 什么是Java虚拟机(JVM)?它与现实中的计算机有什么不同?Java中的基本数据类型有哪些?它们的范围是什么?什么是引用类型?Java中的引用类型有哪些?什么是对象&am…...

大数据Flink(七十四):SQL的滑动窗口(HOP)
文章目录 SQL的滑动窗口(HOP) SQL的滑动窗口(HOP) 滑动窗口定义:滑动窗口也是将元素指定给固定长度的窗口。与滚动窗口功能一样,也有窗口大小的概念。不一样的地方在于,滑动窗口有另一个参数控制窗口计算的频率(滑动窗口滑动的步长)。因此,如果滑动的步长小于窗口大…...

Hystrix和Sentinel熔断降级设计理念
目录 1 基本介绍2 Hystrix信号量和线程池区别2.1 信号量模式2.2 线程池模式2.3 注意 3 Sentinel介绍 1 基本介绍 Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源…...

获取Windows 10中的照片(旧版)下载
Windows 10中的新版照片应用,目前发现无法直接打开部分iOS设备上存储的照片。需要使用照片(旧版)才行。 但目前应用商店中无法直接搜索到照片(旧版),因此笔者提供如下链接,可以直接访问并呼出W…...

【Redis】Redis作为缓存
【Redis】Redis常见面试题(2) 文章目录 【Redis】Redis常见面试题(2)1. 缓存2. Redis作为缓存2.1 缓存雪崩2.2 缓存穿透2.3 缓存击穿2.4 缓存雪崩、缓存穿透、缓存击穿的区别2.5 缓存预热2.6 如何保证缓存和MySQL双写一致 【Redis…...

IDEA(2023)解决运行乱码问题
😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:无 🌼…...

零基础学前端(二)用简单案例去理解 HTML 、CSS 、JavaScript 概念
该篇适用于从零基础学习前端的小白 初学者不懂代码得含义也要坚持模仿逐行敲代码,以身体感悟带动头脑去理解新知识 一、导言 HTML,CSS,JavaScript 都是单独的语言;他们构成前端技术基础; (1)HTM…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...