构建健壮的Spring MVC应用:JSON响应与异常处理
目录
1. 引言
2. JSON
1. 轻量级和可读性
2. 易于编写和解析
3. 自描述性
4. 支持多种数据类型
5. 平台无关性
6. 易于集成
7. 社区支持和标准化
3. 高效处理异常
综合案例
异常处理方式一
异常处理方式二
异常处理方式三
1. 引言
探讨Spring MVC中关键的JSON数据返回和异常处理机制。
2. JSON
2.1 了解JSON数据格式
JSON(JavaScript Object Notation)作为一种数据交换格式具有许多特点和优势,这些特点使其成为广泛应用于Web和应用程序开发的理想选择。下面详细解释了JSON的特点和优势:
1. 轻量级和可读性
- JSON是一种轻量级的文本格式,其数据结构以键-值对(key-value pairs)的形式表示,易于理解和阅读。
- 与XML等其他数据格式相比,JSON更加简洁,不包含繁琐的标签和属性,使数据在传输和存储时更为紧凑。
2. 易于编写和解析
- JSON数据的编写和解析在多种编程语言中都有成熟的支持和库,因此开发人员可以轻松地生成和解析JSON数据。
- 多数现代编程语言都提供了内置的JSON解析器和生成器,使得操作JSON数据变得非常简单。
3. 自描述性
- JSON数据包含字段名和相应的值,使得数据的结构和含义变得明确。
- 数据结构本身包含在数据中,不需要额外的元数据或模式定义。
4. 支持多种数据类型
- JSON支持多种基本数据类型,包括字符串、数字、布尔值、数组和对象(嵌套的键-值对结构)。
- 这种灵活性允许开发人员表示各种复杂的数据结构。
5. 平台无关性
- JSON是一种独立于平台的数据格式,可在各种操作系统和编程语言之间自由交换。
- 这种特性使得不同技术栈的应用程序能够轻松地共享和解释JSON数据。
6. 易于集成
- JSON适用于Web服务、API和数据交换,因此它是构建分布式系统和跨平台应用程序的理想选择。
- 多数Web浏览器都原生支持JSON,使其成为前后端通信的常用数据格式。
7. 社区支持和标准化
- JSON已成为Web应用程序中的事实标准,得到了广泛的社区支持。
- 它的标准规范由RFC 8259定义,这进一步巩固了其在数据交换中的地位。
总的来说,JSON作为一种数据交换格式具有轻量级、可读性强、易于编写和解析、自描述、跨平台、灵活支持多种数据类型等优势。这些特点使得JSON在Web开发、API设计、数据交换以及分布式系统中都广泛应用,并且在不同领域的应用中表现出色。
2.2 Spring MVC中的JSON
导入依赖
<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>
配置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>
使用@ResponseBody注解
package com.liao.controller;import com.liao.biz.UserBiz;
import com.liao.model.User;
import com.liao.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("/user/json")
public class JsonController {@Autowiredprivate UserBiz userBiz;@ResponseBody@RequestMapping("/list")public List<User> list(HttpServletRequest req, User user){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<User> lst = this.userBiz.listPager(user, pageBean);System.out.println(1 / 0);return lst;}@ResponseBody@RequestMapping("/load")public User load(HttpServletRequest req, User user){if(user.getId() != null){List<User> lst = this.userBiz.listPager(user, null);return lst.get(0);}return null;}@ResponseBody@RequestMapping("/mapList")public List<Map> mapList(HttpServletRequest req, User user){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Map> lst = this.userBiz.mapListPager(user, pageBean);return lst;}@ResponseBody@RequestMapping("/mapLoad")public Map mapLoad(HttpServletRequest req, User user){if(user.getId() != null){List<Map> lst = this.userBiz.mapListPager(user, null);return lst.get(0);}return null;}@ResponseBody@RequestMapping("/all")public Map all(HttpServletRequest req, User user){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<User> lst = this.userBiz.listPager(user, pageBean);Map map = new HashMap();map.put("lst",lst);map.put("pageBean",pageBean);return map;}@ResponseBody//@RequestMapping("/jsonStr")public String jsonStr(HttpServletRequest req, User user){return "userEdit";}}
3. 高效处理异常
3.1 异常处理的必要性
Web应用程序需要有效的异常处理机制,因为异常是在应用程序运行过程中不可避免的情况,可以发生各种错误和异常情况,包括但不限于以下原因:
运行时错误: 应用程序可能会遇到运行时错误,例如空指针异常、数据库连接失败、文件不存在等。这些错误通常无法在编译时预测,但需要在运行时进行处理。
外部输入不可控: Web应用程序通常受到来自外部用户或其他系统的输入。用户可能会提供不正确或恶意的输入数据,这可能导致应用程序出现异常。有效的异常处理可以防止这些异常影响应用程序的稳定性和安全性。
资源不足或不可用: 在运行过程中,应用程序可能会遇到资源不足的情况,如数据库连接池用尽、磁盘空间耗尽等。这些情况需要适当的异常处理以避免应用程序崩溃。
网络通信问题: Web应用程序通常需要与其他系统或服务进行通信,这可能会导致网络故障或超时。有效的异常处理可以帮助应用程序优雅地处理这些问题。
业务逻辑异常: 有时应用程序需要捕获和处理与业务逻辑相关的异常情况,例如用户试图执行无权限操作、购物车中的商品数量超出库存等。
以下是为什么需要有效的异常处理机制的一些理由:
稳定性: 有效的异常处理可以帮助应用程序保持稳定性,避免崩溃或不可预测的行为。它可以使应用程序在出现异常情况时恢复正常状态或提供适当的错误信息。
安全性: 适当的异常处理可以增强应用程序的安全性,防止攻击者利用异常情况来获得敏感信息或执行恶意操作。
用户友好性: 异常处理应该提供有意义的错误消息,以便最终用户能够理解问题并采取适当的措施。这有助于提供更好的用户体验。
日志和监控: 通过异常处理,应用程序可以记录异常情况,以便开发人员能够诊断和解决问题。此外,它还可以用于监控应用程序的运行状况。
总之,有效的异常处理机制是确保Web应用程序稳定、安全且用户友好的关键组成部分。通过捕获、处理和记录异常,开发人员可以更好地管理和维护应用程序。
3.2.SpringMVC异常分类
- 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
- 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
- 使用@ControllerAdvice + @ExceptionHandler
综合案例
异常处理方式一
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>
前端异常页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>异常+界面</title>
</head>
<body>
错误信息界面。。。。。。
${ex}
</body>
</html>
异常处理方式二
创建一个名为GlobalException的自定义异常类
GlobalException
package com.liao.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);}
}
GlobalExceptionHandler
GlobalExceptionHandler实现HandlerExceptionResolver接口
package com.liao.component;import com.liao.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");//error.jspif (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;}
}
测试:
异常处理方式三
@ControllerAdvice + @ExceptionHandler
package com.liao.component;import com.liao.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 {// 跳转错误页面
// @ExceptionHandler
// public 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;
// }// 返回错误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;}
}
相关文章:
构建健壮的Spring MVC应用:JSON响应与异常处理
目录 1. 引言 2. JSON 1. 轻量级和可读性 2. 易于编写和解析 3. 自描述性 4. 支持多种数据类型 5. 平台无关性 6. 易于集成 7. 社区支持和标准化 3. 高效处理异常 综合案例 异常处理方式一 异常处理方式二 异常处理方式三 1. 引言 探讨Spring MVC中关键的JSON数据…...
那些配置服务器踩的坑
最近在配置内网,无外网的服务器,纯纯记录一下踩得坑,希望看到的人不要再走这条弯路。 ------------------------------------------------------------------------------------------------------------------------------- 任务ÿ…...
交换机端口镜像详解
交换机端口镜像是一种网络监控技术,它允许将一个或多个交换机端口的网络流量复制并重定向到另一个端口上,以便进行流量监测、分析和记录。通过端口镜像,管理员可以实时查看特定端口上的流量,以进行网络故障排查、安全审计和性能优…...
Spring源码分析(三) IOC 之 createBean()和doCreateBean()
a、在createBean中又是主要做了什么事情? 完成bean得创建,填充属性、循环依赖 、aop等一系列过程 1、createBean() 在createBean中主要干了3件事情 1、解析class -> resolveBeanClass() 2、验证及准备覆盖的方法,lookup-method replace-method -> …...
【鸿蒙(HarmonyOS)】UI开发的两种范式:ArkTS、JS(以登录界面开发为例进行对比)
文章目录 一、引言1、开发环境2、整体架构图 二、认识ArkUI1、基本概念2、开发范式(附:案例)(1)ArkTS(2)JS 三、附件 一、引言 1、开发环境 之后关于HarmonyOS技术的分享,将会持续使…...
Flink中的批和流
批处理的特点是有界、持久、大量,非常适合需要访问全部记录才能完成的计算工作,一般用于离线统计。 流处理的特点是无界、实时, 无需针对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作,一般用于实时统计。 而在Flin…...
【LeetCode-中等题】150. 逆波兰表达式求值
文章目录 题目方法一:栈 题目 方法一:栈 class Solution {public int evalRPN(String[] tokens) {Deque<Integer> deque new LinkedList<>();String rpn "-*/";//符号集 用来判断扫描的是否为运算符int sum 0;for(int i 0 ; i…...
搭建ELK+Filebead+zookeeper+kafka实验
部署 Zookeeper 集群 准备 3 台服务器做 Zookeeper 集群 192.168.10.17 192.168.10.21 192.168.10.22 1.安装前准备 关闭防火墙 systemctl stop firewalld systemctl disable firewalld setenforce 0 安装 JDK yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-…...
java专题练习(抢红包)
package 专题练习;import java.util.Random;public class grab_red_packet {/* 需求:直播抽奖,分别由{2,588,888,1000,10000}五个奖金,请用代码模拟抽奖,奖项出现顺序要随机且不重复打印效果:588元的奖金被抽出*///思路://1. 先用数组把奖金定义好//2. 用random方法给出随机数索…...
AVR 单片机 调试环境 JTAG MKII
注意 驱动 的厂家: 如果驱动备改变为其他厂家的驱动 就与 AVR Studio7不兼容 保证驱动选择正确是 能够使用硬件调试的关键 如果驱动不对,使用 USB驱动修改工具 修改 比如 UsbDriverTool.exe...
C++ - AVL树实现(下篇)- 调试小技巧
前言 本博客是 AVL树的下篇,上篇请看:C - AVL 树 介绍 和 实现 (上篇)_chihiro1122的博客-CSDN博客 上篇当中写插入操作,和其中涉及的 旋转等等细节,还有AVL树的大体框架。 调试小技巧 条件断点 在大项目…...
Mybatis懒加载
懒加载是什么? 按需加载所需内容,当调用到关联的数据时才与数据库交互否则不交互,能大大提高数据库性能,并不是所有场景下使用懒加载都能提高效率。 Mybatis懒加载:resultMap里面的association、collection有延迟加载功…...
DSOX3012A是德科技keysight DSOX3012A示波器
181/2461/8938是德科技DSOX3012A(安捷伦)示波器 是德科技DSOX3012A(安捷伦)是InfiniiVision 3000 X系列中的双通道型号。这款可升级示波器采用突破性技术设计,提供卓越的性能和功能。其独特的5仪器合一设计为相同的预算提供了更大的范围。 是德科技DSOX3012A示波器…...
基于网络表示学习的 新闻推荐算法研究与系统实现
摘要 第1章绪论 新闻推荐通常是利用用户的阅读行为和习惯、阅读选择和爱好等信息,为 用户推荐新闻内容。新闻推荐能够减少用户在数量庞大数据信息中获取信息的 时间消耗,从而能够缓解“信息过载[7]”的难题。以文本为内容的新闻,和商品、 电影、短视频等推荐系统相比,新闻推…...
<Altium Designer> 将.DSN文件导入并转换成SchDoc文件
目录 01 使用向导方式导入.DSN 02 消除Unique Identifiers Errors 03 文章总结 大家好,这里是程序员杰克。一名平平无奇的嵌入式软件工程师。 本文主要是总结和分享将OrCAD Capture画的原理图文件(.DSN)导入到Altium Designer,转换成对应的原理图文件…...
视频定格合璧,批量剪辑轻松插入图片
大家好!想要将视频与图片完美融合吗?现在,我们为您推出一款强大的批量剪辑工具,让您能够轻松在图片中插入视频,让您的创作更加精彩动人! 首先,第一步我们要进入媒体梦工厂主页面,并…...
【Tensorflow 2.12 电影推荐项目搭建】
Tensorflow 2.12 电影推荐项目搭建 学习笔记工具、环境创建项目项目配置安装相关python包召回模型实现排序模型实现实现电影推荐导入模块设置要推荐的用户召回推荐排序推荐推荐结果结尾学习笔记 Tensorflow 2.12 电影推荐项目搭建记录~ Tensorflow是谷歌开源的机器学习框架,可…...
python+opencv特征匹配算法
pythonopencv特征匹配算法 1.安装 pip install opencv-python pip install numpy2.算法明细 import cv2 import numpy as np# 读取两张图像 img1 cv2.imread(image1.jpg,0) # queryImage img2 cv2.imread(image2.jpg,0) # trainImage# 初始化SIFT对象 sift cv2.xfeatur…...
android Compose 实现 webView
在Compose中,目前还没有原生的WebView组件。但是,您可以使用Android Jetpack组件中的AndroidView来将传统的WebView集成到Compose中。下面是一个示例代码: Composable fun WebViewScreen(url: String) {AndroidView(factory { context ->…...
算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理
算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理 欧拉函数AcWing 874. 筛法求欧拉函数 快速幂AcWing 875. 快速幂AcWing 876. 快速幂求逆元 扩展欧几里德(裴蜀定理)AcWing 877. 扩展欧几里得算法AcWing 878. 线性同余方程 中国剩余定理…...
ElasticSearch系列-索引原理与数据读写流程详解
索引原理 倒排索引 倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key。ES底层在检索时底层使用的就是倒排索引。 索引模型 现有索…...
【码银送书第七期】七本考研书籍
八九月的朋友圈刮起了一股晒通知书潮,频频有大佬晒出“研究生入学通知书”,看着让人既羡慕又焦虑。果然应了那句老话——比你优秀的人,还比你努力。 心里痒痒,想考研的技术人儿~别再犹豫了。小编咨询了一大波上岸的大佬ÿ…...
docker容器的设置本地时间(/etc/localtime)和本地时区(/etc/timezone)
本地时区的修改 一般情况下,我们启动docker容器时指定了环境变量: -e TZ:Asia/Ho_Chi_Minh ,容器内的时区就会变成东八区,某些软件则会读取该环境变量作为其使用的时区,该环境变量相当于"残缺版"的命令&…...
侯捷老师C++课程:内存管理
内存管理 第一讲:primitives c应用程序 c内存的基本工具 测试程序: #include <iostream> using namespace std; #include <complex> #include <ext/pool_allocator.h>int main() {// 三种使用方法void* p1 malloc(512); // 512 b…...
A股风格因子看板 (2023.09 第05期)
该因子看板跟踪A股风格因子,该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子,用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第05期,指数组合数据截止日2023-08-31,要点如下 近1年A股风格因子检验统…...
修炼离线:(二)sqoop插入hbase 脚本(增量)
一:mysql创建表,插入数据。 二:hbase创建表。 habse shell create aa(表名),cf(列族)三:mysql_hbase脚本。 #!/bin/shmysqlHost$1 mysqlUserName$2 mysqlUserPass$3 mysqlDbName$4 myqlTbName$5 hbaseTbName$6 hbaseTbRowkey$7…...
跨平台编程开发工具Xojo 2023 Release mac中文版功能介绍
Xojo mac是一款跨平台的软件开发工具,它允许开发人员使用一种编程语言来创建应用程序,然后可以在多个操作系统上运行。Xojo 2023是Xojo开发工具的最新版本,它提供了许多功能和改进,以帮助开发人员更轻松地构建高质量的应用程序。 …...
OpenCV Series : Target Box Outline Border
角点 P1 [0] (255, 000, 000) P2 [1] (000, 255, 000) P3 [2] (000, 000, 255) P4 [3] (000, 000, 000)垂直矩形框 rect cv2.minAreaRect(cnt)targetColor roi_colortargetThickness 1targetColor (255, 255, 255)if lineVerbose:if …...
【AD】【规则设置】设置四层板
设置四层板 一般 4层板,都会把 地 和 VCC放在内层。1、使用快捷键D-K 进入层叠管理器,添加负片层添加完后,修改层名,方便辨识修改格式:属性层号 2、进入相应layer 设置网络设置GND层设置VCC层特点:在层内可…...
Linux安装JDK1.8并配置环境变量
Linux安装JDK并配置环境变量Linux安装JDK并配置环境变量Linux安装JDK并配置环境变量 一、查询已有JAVA环境版本信息 java -version 二、下载Oracle JDK安装包 https://www.oracle.com/java/technologies/downloads/archive/ 三、安装 配置JDK 以下方式适用于安装各版本JDK&…...
移动版wordpress主题/怎么在百度上发表文章
当手机中的应用越来越多、绑定的服务也越来越多时,谁会想到一条短信引发的连锁反应,能让一个人在一夜间倾家荡产?近日,北京许先生的遭遇《中国移动,请你告诉我,为什么一条短信就能骗走我所有的财产…...
南昌做网站哪家便宜/网站优化的方法
题目 1-n个数,初始全为1, m个操作,第i次操作把[li,ri]赋成xi,1<xi<3 求m次操作后这n个数的和 1<n<1e5,0<m<1e5 思路来源 https://blog.csdn.net/zhouzi2018/article/details/81089816 题解 区间赋值 近…...
南昌模板建站定制/seo方案
从Npm Script到Webpack,6种常见的前端构建工具对比 小编说:历史上先后出现了一系列构建工具,它们各有优缺点。由于前端工程师很熟悉JavaScript,Node.js又可以胜任所有构建需求,所以大多数构建工具都是用Node.js开发的。…...
安徽六安彩礼一般给多少/百度 seo 工具
查接口找到的,分享给大家,希望对大家以后开发有用 火车车次查询-余票查询--Api接口 1.来自12306的火车车次数据 使用12306网站的接口,查询余票。此接口采集自这里。全国火车站代号字典,下载。火车票余票查询 http://dynamic.123…...
商务网站规划设计要点/品牌策划方案模板
转载自http://cnlearn.linksprite.com/?p5248#.VwZrzvl95hE 数字 I/O (1)pinMode(pin, mode) 数字IO 口输入输出模式定义函数,pin 表示为0~13, mode 表示为INPUT 或OUTPUT 。(2) digitalWrite(…...
做网站找个人还是找公司好/合肥品牌seo
原文链接:http://blog.csdn.net/fengbingchun/article/details/47378515 Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C库,它里面包含了很多算法。它的License是MPL2。它支持多平台。 Eigen采用源码的方式提供给用户使用,在使用时只…...