【SpringMVC】JSON数据传输与异常处理的使用

文章目录

  • 一、Jackson
    • 1.1 Jackson是什么
    • 1.2 常用注解
    • 1.3 实例
      • 1.3.1导入依赖
      • 1.3.2 配置spring-mvc.xml
      • 1.3.3 JsonController.java
  • 二、Spring MVC异常处理机制
    • 2.1 使用原因
    • 2.2 SpringMVC异常处理
      • 2.2.1 异常处理机制流程图
      • 2.2.2 异常处理的三种方式

一、Jackson

1.1 Jackson是什么

在Java中,Jackson是一个流行的开源库,用于处理JSON数据。它提供了一组功能强大的API,可以将Java对象序列化为JSON格式,或将JSON数据反序列化为Java对象。Jackson库提供了灵活的方式来处理JSON数据,包括读取、写入、转换和操作JSON对象。它是Java开发人员在处理JSON数据时的常用工具之一。

1.2 常用注解

Jackson库提供了一些常用的注解,用于在Java对象和JSON数据之间进行序列化和反序列化的映射。以下是一些常用的Jackson注解:

  1. @JsonProperty:用于指定Java对象属性与JSON字段之间的映射关系
  2. @JsonFormat:用于指定日期、时间等特殊类型属性的格式化方式。
  3. @JsonIgnore:用于忽略某个属性,不进行序列化和反序列化。 @JsonInclude:用于控制在序列化过程中是否包含某个属性。
  4. @JsonAlias:用于指定多个JSON字段名与Java对象属性之间的映射关系。
  5. @JsonCreator:用于指定一个静态工厂方法或构造函数,用于反序列化JSON数据。
  6. @JsonAnyGetter和@JsonAnySetter:用于处理动态属性,允许将未映射到Java对象属性的JSON字段读取和写入。

1.3 实例

1.3.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.3.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>

1.3.3 JsonController.java

@RequestMapping("/queryListBooks")@ResponseBodypublic List<Book> queryListBooks(Book book,HttpServletRequest request){PageBean pageBean=new PageBean();pageBean.setRequest(request);List<Book> books = bookService.queryBookPager(book, pageBean);return   books;};
@RequestMapping("/querySingleBook")@ResponseBodypublic Book querySingleBook(Integer bookId){Book book = bookService.selectByPrimaryKey(bookId);book.setDate(new Date());return book;}@RequestMapping("/querySingleMap")@ResponseBodypublic Map<String, Object> querySingleMap(Integer bookId){return  bookService.querySingleMap(bookId);}
@RequestMapping("/queryMapList")@ResponseBodypublic List<Map<String, Object>> queryMapList( ){return bookService.queryBookAll();}
@RequestMapping("/queryString")@ResponseBodypublic String queryString(){return "book/bookList";}

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

在这里插入图片描述

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

二、Spring MVC异常处理机制

2.1 使用原因

我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是(dao/mapper)层、service层还是controller层,都有可能抛出异常。

而在Spring MVC中提供了一个通用的异常处理机制,它提供了一个成熟、简洁并且清晰的异常处理方案。当使用Spring MVC开发Web应用时,利用这套现成的机制进行异常处理也更加自然并且高效。

2.2 SpringMVC异常处理

2.2.1 异常处理机制流程图

系统的Dao(mapper)、Service、Controller出现都通过throws Exception向上抛出,最后SpringMVC前端控制器交由异常处理器进行异常处理,如下图:
在这里插入图片描述

2.2.2 异常处理的三种方式

1. 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;

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

(1)配置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> 

(2)方法中抛出此异常

@RequestMapping("/querySingleBook")@ResponseBodypublic Book querySingleBook(Integer bookId){Book book = bookService.selectByPrimaryKey(bookId);if(bookId>100)throw new RuntimeException("书本编号大于100,异常抛出!!!");book.setDate(new Date());return book;}

2. 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
(1) 实现HandlerExceptionResolver接口

package com.xqx.exception;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;/*** SpingMVC提供的第二种全局异常处理方式  ,实现HandlerExceptionResolver接口*/
@Component
public class GlobalException implements HandlerExceptionResolver {/**** @param httpServletRequest* @param httpServletResponse* @param o 异常处理的目标* @param e 异常处理的类型* @return*/@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {ModelAndView mv=new ModelAndView();mv.setViewName("error");//判断异常的分类if(e instanceof RuntimeException){RuntimeException ex=(RuntimeException)e;System.out.println(ex.getMessage());mv.addObject("msg",ex.getMessage());}return mv;}
}

(2)创建异常类

package com.xqx.exception;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;/*** SpingMVC提供的第二种全局异常处理方式  ,实现HandlerExceptionResolver接口*/
@Component
public class GlobalException implements HandlerExceptionResolver {/**** @param httpServletRequest* @param httpServletResponse* @param o 异常处理的目标* @param e 异常处理的类型* @return*/@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {ModelAndView mv=new ModelAndView();mv.setViewName("error");//判断异常的分类if(e instanceof RuntimeException){RuntimeException ex=(RuntimeException)e;System.out.println(ex.getMessage());mv.addObject("msg",ex.getMessage());}return mv;}
}

(3)方法中抛出此异常

@RequestMapping("/querySingleBook")@ResponseBodypublic Book querySingleBook(Integer bookId){Book book = bookService.selectByPrimaryKey(bookId);if(bookId>100)throw new BusinessException("书本编号大于100,异常抛出!!!");book.setDate(new Date());return book;}

3. 使用@ControllerAdvice + @ExceptionHandler

(1)

package com.xqx.exception;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;import java.util.HashMap;
import java.util.Map;/*** SpingMVC提供的第三种种全局异常处理方式* 1)@ControllerAdvice +@ExceptionHandler* 2)@RestControllerAdvice +@ExceptionHandler*      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器*/
@ControllerAdvice
public class GlobalException2{@ExceptionHandlerpublic ModelAndView exceptionHandler(Exception e){ModelAndView mv=new ModelAndView();//设置错误页面mv.setViewName("error");//判断异常类型if(e instanceof BusinessException){BusinessException ex=(BusinessException)e;mv.addObject("msg","系统繁忙,请稍后再试.......");}mv.setView(new MappingJackson2JsonView());return mv;}}

(2) 返回JSON格式

package com.xqx.exception;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;import java.util.HashMap;
import java.util.Map;/*** SpingMVC提供的第三种种全局异常处理方式* 1)@ControllerAdvice +@ExceptionHandler* 2)@RestControllerAdvice +@ExceptionHandler*      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器*/
@RestControllerAdvice
public class GlobalException2{@ExceptionHandlerpublic ModelAndView exceptionHandler(Exception e){ModelAndView mv=new ModelAndView();mv.setViewName("error");//判断异常类型if(e instanceof BusinessException){BusinessException ex=(BusinessException)e;mv.addObject("msg","系统繁忙,请稍后再试.......");}//强制更换视图解析器  不跳页面!!!mv.setView(new MappingJackson2JsonView());return mv;}}

(3) 返回异常信息和状态码

package com.xqx.exception;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;import java.util.HashMap;
import java.util.Map;/*** SpingMVC提供的第三种种全局异常处理方式* 1)@ControllerAdvice +@ExceptionHandler* 2)@RestControllerAdvice +@ExceptionHandler*      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器*/
@RestControllerAdvice
public class GlobalException2{@ExceptionHandlerpublic Map<String, Object> exceptionHandler(Exception e){Map<String, Object> json=new HashMap();//判断异常类型if(e instanceof BusinessException){json.put("msg","系统繁忙,请稍后再试.......");json.put("code",500);}return json;}
}

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

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

相关文章

中项系统集成项目管理2023上半年真题及解析

中项系统集成项目管理2023上半年真题及解析 上午题1. 在 (1) 领域&#xff0c;我国还远未达到世界先进水平&#xff0c;需要发挥新型举国体制优势&#xff0c;集中政府和市场两方面的力量全力发展2. ChatGPT于 2022年 11 月 30 日发布&#xff0c;它是人工智能驱动的 (2) 工具3…

机器学习基础之《分类算法(6)—决策树》

一、决策树 1、认识决策树 决策树思想的来源非常朴素&#xff0c;程序设计中的条件分支结构就是if-else结构&#xff0c;最早的决策树就是利用这类结构分割数据的一种分类学习方法 2、一个对话的例子 想一想这个女生为什么把年龄放在最上面判断&#xff01;&#xff01;&…

RabbitMQ常见问题

一、RabbitMQ如何保证消息不丢失&#xff1f; 这是面试时最喜欢问的问题&#xff0c;其实这是个所有MQ的一个共性的问题&#xff0c;大致的解 决思路也是差不多的&#xff0c;但是针对不同的MQ产品会有不同的解决方案。而RabbitMQ 设计之处就是针对企业内部系统之间进行调用设…

递归学习——记忆化搜索

目录 ​编辑 一&#xff0c;概念和效果 二&#xff0c;题目 1.斐波那契数 1.题目 2.题目接口 3.解题思路 2.不同的路径 1.题目 2.题目接口 3.解题思路 3.最长增长子序列 1.题目 2.题目接口 3.解题思路 4.猜数字游戏II 1.题目 2.题目接口 3.解题思路 总结&a…

【SpringMVC】Jrebel 插件实现热部署与文件上传

目录 一、JRebel 1.1 Jrebel介绍 1.2 Jrebel插件下载 1.3 Jrebel服务下载并启动 1.4 在线生成GUID 1.5 JRebel激活 1.6 相关设置 注意❗ 二、文件上传、下载 2.1 导入pom依赖 2.2 配置文件上传解析器 2.3 文件上传表单设置 2.4 文件上传实现 2.5 文件下载实现 2…

微信会员卡开发流程

功能需求&#xff1a; 通过微信第三方平台创建的模板小程序&#xff0c;想要实现用户在小程序支付一定金额后领取会员卡&#xff0c;领取会员卡后可给用户下发一定数量的优惠券&#xff0c;并且实现用户在小程序消费享受商品折扣。 开发流程&#xff1a; 一、了解微信的3个平…

HTTP协议的基本概念与理解!

一、什么是HTTP协议 HTTP&#xff08;超文本传输协议&#xff09;是一个基于请求与响应&#xff0c;无状态的&#xff0c;应用层的协议&#xff0c;常基于TCP/IP协议传输数据&#xff0c;互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷…

【RocketMQ】消息的拉取

在上一讲中&#xff0c;介绍了消息的存储&#xff0c;生产者向Broker发送消息之后&#xff0c;数据会写入到CommitLog中&#xff0c;这一讲&#xff0c;就来看一下消费者是如何从Broker拉取消息的。 RocketMQ消息的消费以组为单位&#xff0c;有两种消费模式&#xff1a; 广播…

实时显示当前文件夹下的文件大小,shell脚本实现

图片来源于网络&#xff0c;如果侵权请联系博主删除&#xff01; 需求&#xff1a; 写一个shell终端命令&#xff0c;实时显示当前文件夹下的文件大小 实现&#xff1a; 您可以使用以下的Shell脚本命令来实时显示当前文件夹下的文件大小&#xff1a; while true; docleardu …

百度飞浆OCR识别表格入门python实践

1. 百度飞桨&#xff08;PaddlePaddle&#xff09; 百度飞桨&#xff08;PaddlePaddle&#xff09;是百度推出的一款深度学习平台&#xff0c;旨在为开发者提供强大的深度学习框架和工具。飞桨提供了包括OCR&#xff08;光学字符识别&#xff09;在内的多种功能&#xff0c;可…

《动手学深度学习 Pytorch版》 4.10 实战Kaggle比赛:预测比赛

4.10.1 下载和缓存数据集 import hashlib import os import tarfile import zipfile import requests#save DATA_HUB dict() DATA_URL http://d2l-data.s3-accelerate.amazonaws.com/def download(name, cache_diros.path.join(.., data)): #save"""下载一个…

【chromium】windows 获取源码到本地

从github的chromium 镜像git clone 到2.5G失败了官方说不能,要去 windows_build_instructions vs2017和19都是32位的 vs2022是x64的 vs2022_install You may also have to set variable vs2022_install to your installation path of Visual Studio 2022,

自定义Dynamics 365实施和发布业务解决方案 3. 开箱即用自定义

在本章中,您将开始开发SBMA会员应用程序。在开发的最初阶段,主要关注开箱即用的定制。在第2章中,我们讨论了如何创建基本解决方案的细节,在本章中,将创建作为解决方案补丁的基本自定义,并展示将解决方案添加到源代码管理和目标环境的步骤。 表单自定义 若要开始表单自定…

宠物行业如何进行软文营销

如今&#xff0c;宠物已经成为了人们生活中不可或缺的一部分&#xff0c;大众对于萌宠的喜爱与日俱增&#xff0c;随着“萌宠经济”升温&#xff0c;越来越多的商机开始出现&#xff0c;伴随着宠物市场竞争的日益激烈&#xff0c;宠物行业的营销光靠硬广告很难吸引受众&#xf…

使用内网端口映射方案,轻松实现U8用友ERP的本地部署异地远程访问——“cpolar内网穿透”

文章目录 前言1. 服务器本机安装U8并调试设置2. 用友U8借助cpolar实现企业远程办公2.1 在被控端电脑上&#xff0c;点击开始菜单栏&#xff0c;打开设置——系统2.2 找到远程桌面2.3 启用远程桌面 3. 安装cpolar内网穿透3.1 注册cpolar账号3.2 下载cpolar客户端 4. 获取远程桌面…

小美的数组操作2---牛客周赛 Round 11

注意给a[ 0 ]赋一个最小值 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e55; int t,n,m,a[N],cnt[N]; int main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i1;i<n;i){scanf(&q…

Mann-Kendall 检验

一、M-K 趋势检验 Mann-Kendall 突变检验是一种非参数的假设检验方法&#xff0c;用于检验时间序列数据中的趋势性变化。该检验方法通过比较每个数据点与其之前数据点的大小&#xff0c;来检测时间序列数据中的单调趋势&#xff08;上升、下降或没有趋势&#xff09;。具体来说…

word转PDF文件变小,图片模糊

word论文29M&#xff0c;文件——另存为——只有1.5M左右&#xff0c;图片压缩严重&#xff0c;图片看不清。 word中很多大图&#xff0c;5M一张的图&#xff0c;所以word很大。 找了很多方法&#xff0c;转换后都在2M左右&#xff0c;勉强可以。 直到找到了这个&#xff0c…

Java-集合类

集合 Java集合是Java中用于存储和管理一组对象的工具。Java集合提供了相应的方法&#xff0c;用于用户对集合内数据的操作。 Java集合类提供了许多不同的数据结构&#xff0c;如列表、队列、栈、集合和映射&#xff0c;以满足不同类型的编程需求。 程序中如何存储大批量同类型…

C 编译原理

C 编译原理 目录 C 编译原理引入GCC 工具链介绍C运行库 编译准备工作编译过程1.预处理2.编译3.汇编4.链接 分析ELF文件1.ELF文件的段2.反汇编ELF C语言编译过程 - 摘录编译预处理编译、优化汇编链接过程 引入 大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高…