构建健壮的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应用程序需要有效的异常处理机制,因为异常是在应用程序运行过程中不可避免的情况,可以发生各种错误和异常情况,包括但不限于以下原因:

  1. 运行时错误: 应用程序可能会遇到运行时错误,例如空指针异常、数据库连接失败、文件不存在等。这些错误通常无法在编译时预测,但需要在运行时进行处理。

  2. 外部输入不可控: Web应用程序通常受到来自外部用户或其他系统的输入。用户可能会提供不正确或恶意的输入数据,这可能导致应用程序出现异常。有效的异常处理可以防止这些异常影响应用程序的稳定性和安全性。

  3. 资源不足或不可用: 在运行过程中,应用程序可能会遇到资源不足的情况,如数据库连接池用尽、磁盘空间耗尽等。这些情况需要适当的异常处理以避免应用程序崩溃。

  4. 网络通信问题: Web应用程序通常需要与其他系统或服务进行通信,这可能会导致网络故障或超时。有效的异常处理可以帮助应用程序优雅地处理这些问题。

  5. 业务逻辑异常: 有时应用程序需要捕获和处理与业务逻辑相关的异常情况,例如用户试图执行无权限操作、购物车中的商品数量超出库存等。

以下是为什么需要有效的异常处理机制的一些理由:

  • 稳定性: 有效的异常处理可以帮助应用程序保持稳定性,避免崩溃或不可预测的行为。它可以使应用程序在出现异常情况时恢复正常状态或提供适当的错误信息。

  • 安全性: 适当的异常处理可以增强应用程序的安全性,防止攻击者利用异常情况来获得敏感信息或执行恶意操作。

  • 用户友好性: 异常处理应该提供有意义的错误消息,以便最终用户能够理解问题并采取适当的措施。这有助于提供更好的用户体验。

  • 日志和监控: 通过异常处理,应用程序可以记录异常情况,以便开发人员能够诊断和解决问题。此外,它还可以用于监控应用程序的运行状况。

总之,有效的异常处理机制是确保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;}
}

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

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

相关文章

【autodl/linux配环境心得:conda/本地配cuda,cudnn及pytorch心得】

linux配环境心得&#xff1a;conda/本地配cuda&#xff0c;cudnn及pytorch心得 我们服务器遇到的大多数找不到包的问题一&#xff0c;服务器安装cuda和cudnn使用conda在线安装cuda和cudnn使用conda进行本地安装检查conda安装的cuda和cudnn本地直接安装cuda和cudnn方法一&#x…

java高级:注解

目录 认识注解&自定义注解元注解解析注解注解的应用场景 认识注解&自定义注解 注解和反射一样&#xff0c;都是用来做框架的&#xff0c;我们这里学习注解的目的其实是为了以后学习框架或者做框架做铺垫的。 先来认识一下什么是注解&#xff1f;Java注解是代码中的特…

嵌入式学习笔记(31)异常向量表的编程处理

6.5.1像内存一样去访问异常向量表 &#xff08;1&#xff09;S5PV210的异常向量表可以改变&#xff08;在CP15协处理器中&#xff09;&#xff0c;以适应操作系统的需求。但是目前系统刚启动&#xff0c;此时DRAM尚未初始化&#xff0c;程序哦都市在iSRAM中运行。210在iSRAM中…

C++下基于粒子群算法解决TSP问题

粒子群优化算法求解TSP旅行商问题C&#xff08;2020.11.12&#xff09;_jing_zhong的博客-CSDN博客 混合粒子群算法&#xff08;PSO&#xff09;&#xff1a;C实现TSP问题 - 知乎 (zhihu.com) 一、原理 又是一个猜答案的算法&#xff0c;和遗传算法比较像&#xff0c;也是设…

入门人工智能 ——自然语言处理介绍,并使用 Python 进行文本情感分析(5)

入门人工智能 ——自然语言处理介绍&#xff0c;并使用 Python 进行文本情感分析&#xff08;5&#xff09;&#xff09; 入门人工智能 ——自然语言处理介绍&#xff0c;并使用 Python 进行文本情感分析介绍自然语言处理的挑战NLP的基本任务NLP的基本技术NLP的应用领域 使用 P…

FPGA的基础架构,什么是CLB?

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处 CLB是指可编程逻辑功能块&#xff08;Configurable Logic Blocks&#xff09;,顾名思义就是可编程的数字逻辑电路。CLB是FPGA内的三个基本逻辑单元。C…

与社交媒体结合:视频直播美颜sdk在社交平台上的应用

为了让直播内容更吸引人&#xff0c;视频直播美颜sdk&#xff08;Software Development Kit&#xff09;正逐渐崭露头角&#xff0c;为社交媒体用户提供了卓越的美颜效果和互动体验。 一、什么是视频直播美颜sdk&#xff1f; 在深入讨论如何将视频直播美颜sdk整合到社交媒体平…

CSS元素浮动

概述 浮动简介 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面布局方式之一。 元素浮动后的特点 脱离文档流。不管浮动前是什么元素&#xff0c;浮动后&#xff0c;默认宽与高都是被内容撑开的&#xff08;尽可能小&#xff09;&am…

时序分解 | MATLAB实现基于小波分解信号分解分量可视化

时序分解 | MATLAB实现基于小波分解信号分解分量可视化 目录 时序分解 | MATLAB实现基于小波分解信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于小波分解的分量可视化&#xff0c;MATLAB编程程序&#xff0c;用于将信号分解成不同尺度和频率的子信…

实用技巧:Linux上实现OpenGauss数据库远程连接,方便的跨网络数据操作

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 &#x1f341; 小结 &#x1f341; 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许…

Spring-MVC使用JSR303及拦截器,增强网络隐私安全

目录 一、JSR303 ( 1 ) 是什么 ( 2 ) 作用 ( 3 ) 常用注解 ( 4 ) 入门使用 二、拦截器 2.1 是什么 2.2 拦截器与过滤器的区别 2.3 应用场景 2.4 基础使用 2.5 用户登录权限控制 给我们带来的收获 一、JSR303 ( 1 ) 是什么 JSR 303是Java规范请求&#xff…

进程间通信——共享内存

目录 共享内存的原理 共享内存通信的实现步骤 通信实例 共享内存的原理 原理&#xff1a;可以说&#xff0c;共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存&#xff0c;不需要任何数据的复制。为了在多个进程间交换信息&#xff0c;内核专门留出一块内…

C语言 —— 初步入门知识(第一个C语言程序、数据类型、变量常量、字符与注释)

本篇文章介绍C语言的基础知识&#xff0c;使读者对C语言能够有一个大概的认识. 不会细写每一个知识点, 但是能够入门C语言, 进行初步的C语言代码阅读. 首先, 什么是语言? 对于人和人之间进行交流的语言, 我们知道, 可以通过汉语, 英语, 日语等语言进行交流. 那么对于人和计算…

计算机网络:三次握手与四次挥手

摘取作者&#xff1a;拓跋阿秀 三次握手 三次握手&#xff08;Three-way Handshake&#xff09;其实就是指建立一个TCP连接时&#xff0c;需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后…

SpringMVC系列(四)之SpringMVC实现文件上传和下载

目录 前言 一. SpringMVC文件上传 1. 配置多功能视图解析器 2. 前端代码中&#xff0c;将表单标记为多功能表单 3. 后端利用MultipartFile 接口&#xff0c;接收前端传递到后台的文件 4. 文件上传示例 1. 相关依赖&#xff1a; 2. 逆向生成对应的类 3. 后端代码&#xf…

(10)(10.9) 术语表(一)

文章目录 前言 1 2.4Ghz 2 AGL 3 AHRS 4 APM 5 AMA 6 Arduino 7 APM (AutoPilot Mega) 8 ATC 9 Copter 10 Plane 11 Rover 12 BEC 13 Bootloader 14 COA 15 DCM 16 Eagle file 17 ESC 18 Firmware 19 FPV 20 FTDI 前言 &#xff01;Note 术语表未编入索…

微信小程序学习笔记1.0

第1章 微信小程序基础 1.1 微信小程序介绍 1.1.1 什么是微信小程序 微信小程序的特点&#xff1a; ① 微信小程序是不需要下载和安装的&#xff1b; ② 它可以完成App应用软件的交互功能&#xff1b; ③ 用户扫一扫或者搜一下就可以使用小程序&#xff1b; ④ 微信小程序…

Python模板注入(SSTI)

概念 发生在使用模板引擎解析用户提供的输入时。模板注入漏洞可能导致攻击者能够执行恶意代码或访问未授权的数据。 模板引擎可以让&#xff08;网站&#xff09;程序实现界面与数据分离&#xff0c;业务代码与逻辑代码分离。即也拓宽了攻击面&#xff0c;注入到模板中的代码可…

数据库逻辑透明-架构真题(二十九)

&#xff08;2020年&#xff09;假设某计算机字长为32位&#xff0c;该计算机文件管理系统磁盘空间管理采用位示图&#xff08;bitmap&#xff09;记录磁盘的使用情况。若磁盘的容量为300GB&#xff0c;物理块大小为4MB&#xff0c;那么位示图的大小为&#xff08;&#xff09;…

海外媒体发稿:海外汽车媒体推广9个方式解析

根据下列9个国外汽车媒体推广方式&#xff0c;企业能够在国际范围内突破边界&#xff0c;获得领域关心。这将帮助企业完成国际化发展发展战略&#xff0c;扩展市场占有率和提升盈利空间。【华媒舍】国外全媒体发表文章将会成为企业完成这一目标的重要方式&#xff0c;为企业带来…