“深入理解SpringMVC的JSON数据返回和异常处理机制“

目录

  • 引言
    • 1. SpringMVC之JSON数据返回
      • 1.1 导入依赖
      • 1.2 配置弹簧-MVC.xml
      • 1.3 @ResponseBody注解使用
      • 1.4.Jackson
    • 2. 异常处理机制
      • 2.1 为什么要全局异常处理
      • 2.2 异常处理思路
      • 2.3 SpringMVC异常分类
      • 2.4 综合案例
    • 总结

在这里插入图片描述

引言

在现代Web开发中,SpringMVC是一个广泛使用的框架,它提供了丰富的功能和灵活的配置选项。本文将深入探讨两个重要的主题:SpringMVC中的JSON数据返回和异常处理机制。我们将逐步介绍相关的配置和使用方法,并通过案例和综合实例来加深理解。

1. SpringMVC之JSON数据返回

1.1 导入依赖

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

1.2 配置弹簧-MVC.xml

为了使SpringMVC能够正确处理JSON数据返回,我们需要在配置文件中进行相应的配置。以便正确处理JSON数据返回的请求。

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

1.3 @ResponseBody注解使用

@ResponseBody注解的作用是将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。

注意:在使用此注解之后不会再走视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

 <select id="selBySnamePager" resultType="com.yuan.model.Student" parameterType="com.yuan.model.Student" >select<include refid="Base_Column_List" />from t_mysql_student<where><if test="sname!=null">and sname like concat('%',#{sname},'%')</if></where></select><select id="mapListPager" resultType="java.util.Map" parameterType="com.yuan.model.Student" >select<include refid="Base_Column_List" />from t_mysql_student<where><if test="sname != null">and sname like concat('%',#{sname},'%')</if></where></select>
/*** 返回List<T>* @param req* @param student* @return*/@ResponseBody@RequestMapping("/list")public List<Student> list(HttpServletRequest req, Student student){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Student> lst = this.studentBiz.selBySnamePager(student, pageBean);return lst;}

在这里插入图片描述

  /*** 返回T* @param req* @param Student* @return*/@ResponseBody@RequestMapping("/load")public Student load(HttpServletRequest req, Student Student){if(Student.getSname() != null){List<Student> lst = this.studentBiz.selBySnamePager(Student, null);return lst.get(0);}return null;}

在这里插入图片描述

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

在这里插入图片描述

 /*** 返回Map* @param req* @param Student* @return*/@ResponseBody@RequestMapping("/mapLoad")public Map mapLoad(HttpServletRequest req, Student Student){if(Student.getSname() != null){List<Map> lst = this.studentBiz.mapListPager(Student, null);return lst.get(0);}return null;}

在这里插入图片描述

 @ResponseBody@RequestMapping("/all")public Map all(HttpServletRequest req, Student Student){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Student> lst = this.studentBiz.selBySnamePager(Student, pageBean);Map map = new HashMap();map.put("lst",lst);map.put("pageBean",pageBean);return map;}

在这里插入图片描述

@ResponseBody@RequestMapping("/jsonStr")public String jsonStr(HttpServletRequest req, Student Student){return "clzEdit";}

在这里插入图片描述

  • @JsonIgnore 隐藏json数据中的某个属性

@ToString
public class Student {@JsonIgnore@NotBlank(message = "编号不能为空")private String sid;@NotBlank(message = "名字不能为空")private String sname;@NotBlank(message = "年龄不能为空")private String sage;@NotBlank(message = "性别不能为空")private String ssex;

在这里插入图片描述

1.4.Jackson

  • 1.4.1.介绍

​ Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。

特点

  • 容易使用,提供了高层次外观,简化常用的用例。
  • 无需创建映射,API提供了默认的映射大部分对象序列化。
  • 性能高,快速,低内存占用
  • 创建干净的json
  • 不依赖其他库
  • 代码开源

1.4.2.常用注解

注解说明
@JsonIgnore作用在字段或方法上,用来完全忽略被注解的字段和方法对应的属性
@JsonProperty作用在字段或方法上,用来对属性的序列化/反序列化,可以用来避免遗漏属性,同时提供对属性名称重命名
@JsonIgnoreProperties作用在类上,用来说明有些属性在序列化/反序列化时需要忽略掉
@JsonUnwrapped作用在属性字段或方法上,用来将子JSON对象的属性添加到封闭的JSON对象
@JsonFormat指定序列化日期/时间值时的格式

2. 异常处理机制

2.1 为什么要全局异常处理

异常处理是一个重要的开发任务,它可以帮助我们更好地处理程序中的错误和异常情况。本节将介绍为什么我们需要全局异常处理机制,并讨论其重要性和优势。

2.2 异常处理思路

系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。
在这里插入图片描述

2.3 SpringMVC异常分类

  • 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
  • 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
  • 使用@ControllerAdvice + @ExceptionHandler

2.4 综合案例

通过一个综合案例,我们将深入了解如何在SpringMVC中处理异常情况。本节将介绍一个实际的案例,并演示如何使用全局异常处理机制来处理异常。

  • 异常处理方式一

SpringMVC中自带了一个异常处理器叫SimpleMappingExceptionResolver,该处理器实现了HandlerExceptionResolver 接口,全局异常处理器都需要实现该接口。

<!-- 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.jsp
<%--Created by IntelliJ IDEA.User: yuanhDate: 2023/9/13Time: 16:07To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
异常
${ex}
</body>
</html>
  • 异常代码

在这里插入图片描述

  • 运行异常效果
    在这里插入图片描述

  • 异常处理方式二

GlobalException

package com.yuan.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

package com.yuan.Component;import com.yuan.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, Student Student){if(true)throw  new GlobalException("异常123");return "clzEdit";}

在这里插入图片描述
在这里插入图片描述

  • 处理异常三@ControllerAdvice
package com.yuan.Component;import com.yuan.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;}
}

在这里插入图片描述
在这里插入图片描述

总结

本文深入探讨了SpringMVC中的JSON数据返回和异常处理机制。我们从配置和使用方法入手,逐步介绍了相关的知识点,并通过案例和综合实例加深了理解。希望本文能够帮助读者更好地理解和应用SpringMVC中的JSON数据返回和异常处理机制。

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

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

相关文章

Linux权限的理解

目录 权限的概念权限管理默认权限访问权限的相关指令粘滞位 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为核心 但我们不能直接接触核心&#xff0c;我们不擅长和内核交流&#xff0c;它也没法信任你&#xff0c;所以需要通过外壳程序 shell &#xff0c;shell外壳…

应用在儿童平板防蓝光中的LED防蓝光灯珠

现在电子产品多&#xff0c;手机、平板电脑、电子书等等&#xff0c;由于蓝光有害眼睛健康&#xff0c;于是市场上有很多防蓝光的眼镜、防蓝光的手机膜、防蓝光的平板&#xff0c;这些材料和设备到底有没有用&#xff1f;如何正确预防蓝光危害呢&#xff1f; 我们现在所用的灯…

轻量级软件FastGithub实现稳定访问github

当我们想访问全球最大的“同性交友网站”https://github.com/ 时&#xff0c;总会出现无法访问的界面&#xff0c;令人非常苦恼&#xff1a;幸运的是&#xff0c;有一种轻量级的软件可以帮助我们稳定地访问GitHub&#xff0c;那就是FastGithub。 什么是FastGithub&#xff1f…

【Linux系统编程】冯诺依曼体系结构

文章目录 1. 冯诺依曼体系结构2. 为什么要存储器&#xff08;内存&#xff09;&#xff1f;作用是什么&#xff1f;3. 数据流向分析 这篇文章&#xff0c;我们来认识一下冯诺依曼体系结构 1. 冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本&#xff1b;我们不常见的计…

智慧工地管理系统平台软件源码

智慧工地系统围绕工程现场人、机、料、法、环及施工过程中质量、安全、进度、成本等各项数据满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效。 一、面向对象 企 业&#xff1a; 帮助创立初期的公司或团队快速搭建产品的技术平台&#xff0c;加快公司项目开发进…

SpringBoot运维实用篇

SpringBoot运维实用篇 ​ 基础篇发布以后&#xff0c;看到了很多小伙伴在网上的留言&#xff0c;也帮助超过100位小伙伴解决了一些遇到的问题&#xff0c;并且已经发现了部分问题具有典型性&#xff0c;预计将有些问题在后面篇章的合适位置添加到本套课程中&#xff0c;作为解…

API接口文档管理系统平台搭建(更新,附系统源码及教程)

简介 这是一款简洁大方的API接口文档管理系统&#xff0c;附系统源码及教程方法。可以轻松管理和使用API接口。 安装步骤 打开config/database.php配置数据库信息导入数据库data.sql设置运行目录为/public伪静态设置think PHP后台地址/admin/login.html 账号&#xff1a;adm…

字节一面:说说var、let、const之间的区别

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;作为一名前端开发工程师&#xff0c;熟练掌握js是我们的必备技能&#xff0c;var、let、const之间的区别我们也得熟练掌握&#xff0c;博主在这给大家细细道来。 &#x1f…

SQL优化--排序优化(order by)

Using filesort : 通过表的索引或全表扫描&#xff0c;读取满足条件的数据行&#xff0c;然后在排序缓冲区sort buffer中完成排序操作&#xff0c;所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。 Using index : 通过有序索引顺序扫描直接返回有序数据&#xff0c…

基于SSM+Vue的校园教务系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

振弦采集仪和传感器形成完整链条的岩土工程解决方案

振弦采集仪和传感器形成完整链条的岩土工程解决方案 振弦采集仪和传感器是岩土工程领域中非常重要的两个设备&#xff0c;它们可以形成一个完整的监测系统&#xff0c;用于测量和记录土体或岩石结构的振动和应力等关键参数。该方案的实现可以提供有力的支撑&#xff0c;从而确…

SOAP WebService 发布服务成功,但是访问404

原因 我这里是出在路由问题&#xff0c;因为一般我们都会配置WebServiceConfig&#xff0c;WebServiceConfig里又会定义ServletRegistrationBean&#xff0c;用于将一个Servlet注册到Web应用程序中&#xff0c;这里会配置上路径&#xff0c;如下&#xff1a; 但是项目有可能在…

动手学深度学习_个人笔记01_李沐(更新中......)

序言 神经网络——本书中关注的DL模型的前身&#xff0c;被认为是过时的工具。 深度学习在近几年推动了CV、NLP和ASR等领域的快速发展。 关于本书 让DL平易近人&#xff0c;教会概念、背景和代码。 一种结合了代码、数学和HTML的媒介 测试深度学习&#xff08;DL&#xf…

【Redis】Lua脚本在Redis中的基本使用及其原子性保证原理

文章目录 背景一、Eval二、EvalSHA三、Redis 对 Lua 脚本的管理3.1 script flush3.2 script exists3.3 script load3.4 script kill 四、Lua在Redis中原子性执行的原理 背景 Lua 本身是一种轻量小巧的脚本语言&#xff0c;在Redis2.6版本开始引入了对Lua脚本的支持。通过在服务…

Hadoop源码阅读(二):DataNode启动

说明&#xff1a; 1.Hadoop版本&#xff1a;3.1.3 2.阅读工具&#xff1a;IDEA 2023.1.2 3.源码获取&#xff1a;Index of /dist/hadoop/core/hadoop-3.1.3 (apache.org) 4.工程导入&#xff1a;下载源码之后得到 hadoop-3.1.3-src.tar.gz 压缩包&#xff0c;在当前目录打开Pow…

【算法|虚拟头节点|链表】移除链表元素

Leetcode203 移除链表元素 题目描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xf…

通过curl命令分析http接口请求各阶段的耗时等

目录 一、介绍二、功能1、-v 输出请求 响应头状态码 响应文本等信息2、-x 测试代理ip是否能在该网站使用3、-w 额外输出查看接口请求响应的消耗时间4、-o 将响应结果存储到文件里面5、-X post请求测试 (没测成功用的不多) 一、介绍 Curl是一个用于发送和接收请求的命令行工具和…

使用Python CV2融合人脸到新图片--优化版

优化说明 上一版本人脸跟奥特曼图片合并后边界感很严重&#xff0c;于是查找资料发现CV2还有一个泊松函数很适合融合图像。具体代码如下&#xff1a; import numpy as np import cv2usrFilePath "newpic22.jpg" atmFilePath "atm2.jpg" src cv2.imrea…

基于matlab实现的额 BP神经网络电力系统短期负荷预测未来(对比+误差)完整程序分享

基于matlab实现的额 BP神经网络电力系统短期负荷预测 完整程序&#xff1a; clear; clc; %%输入矢量P&#xff08;15*10&#xff09; P[0.2452 0.1466 0.1314 0.2243 0.5523 0.6642 0.7105 0.6981 0.6821 0.6945 0.7549 0.8215 0.2415 0.3027 0; 0.2217 0.1581 0.1408 0.23…

【JVM 内存结构丨堆】

堆 定义内存分配特点:分代结构对象分配过程Full GC /Major GC 触发条件引用方式堆参数堆内存实例 主页传送门&#xff1a;&#x1f4c0; 传送 定义 JVM&#xff08;Java Virtual Machine&#xff09;堆是Java应用程序运行时内存管理的重要组成部分之一。堆内存用于存储Java对象…