SpringBoot(自定义转换器+处理Json+内容协商)

news/2024/5/25 9:38:10/文章来源:https://blog.csdn.net/m0_64637029/article/details/136721901

文章目录

    • 1.自定义转换器
        • 1.代码实例
          • 1.save.html
          • 2.编写两个bean
            • 1.Car.java
            • 2.Monster.java
          • 3.WebConfig.java 配置类来自定义转换器
          • 4.测试
        • 2.注意事项和细节
          • 1.debug查看转换器总数
            • 1.打断点
            • 2.执行到断点后,选左边的192
            • 3.可以看出,加上自定义的转换器一共125个
          • 2.一次新增多个转换器
          • 3.多个转换器的key重复的情况
    • 2.处理Json
        • 1.需求分析
        • 2.代码实现
        • 3.测试
    • 3.内容协商
        • 1.基本介绍
        • 2.应用实例
          • 首先在pom.xml引入可以处理xml的依赖
          • 1.需求分析
          • 2.使用postman测试,修改Accept为application/xml
          • 3.返回的结果是xml类型
          • 4.如果换成原来的任意类型
          • 5.返回的结果是json类型
        • 3.debug当Accept是xml时的源码
          • 1.ctrl + n 找到AbstractJackson2HttpMessageConverter
          • 2.下断点
          • 3.debug启动
          • 4.直接跳到关键部分
          • 5.再跳一下
        • 4.使用浏览器发送请求分析
        • 5.SpringBoot开启基于内容协商的功能
          • 1.需求分析
          • 2.开启基于内容协商的功能 application.yml
          • 3.具体使用
        • 6.内容协商总结
            • SpringBoot中如果只包含JSON相关的依赖(如Jackson),那么返回的数据默认是JSON格式

1.自定义转换器

1.代码实例
1.save.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/save" method="post">编号: <input name="id" value="100"><br/>姓名: <input name="name" value="牛魔王"/> <br/>年龄: <input name="age" value="120"/> <br/>婚否: <input name="isMarried" value="true"/> <br/>生日: <input name="birth" value="2000/11/11"/> <br/><!--使用自定义转换器来关联acr,字符串整体提交,使用,间隔-->坐骑: <input name="car" value="大白熊,666.6"><br><input type="submit" value="保存"/>
</form>
</body>
</html>
2.编写两个bean
1.Car.java
package com.sun.springboot.bean;import lombok.Data;/*** @author 孙显圣* @version 1.0*/
@Data
public class Car {private String name;private Double price;
}
2.Monster.java
package com.sun.springboot.bean;import lombok.Data;import java.util.Date;/*** @author 孙显圣* @version 1.0*/
@Data
public class Monster {private Integer id;private String name;private Integer age;private Boolean isMarried;private Date birth;private Car car;
}
3.WebConfig.java 配置类来自定义转换器
package com.sun.springboot.config;import com.sun.springboot.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @author 孙显圣* @version 1.0*/
@Configuration(proxyBeanMethods = false) //启动Lite模式,则注入的bean对象必须通过该配置类的bean对象来获取才能生效,所有的bean都是多例
public class WebConfig {//注入多例bean WebMvcConfigurer@Beanpublic WebMvcConfigurer webMvcConfigurer() {//1.使用匿名内部类来实现WebMvcConfigurer接口的方法,并返回对象return new WebMvcConfigurer() {@Override//2.实现addFormatters方法public void addFormatters(FormatterRegistry registry) {//3.调用addConverter方法,然后使用匿名内部类实现Converter接口的方法,里面的泛型就是从什么类型转换到什么类型registry.addConverter(new Converter<String , Car>() {@Overridepublic Car convert(String s) { //这个s就是传进来的数据String类型的//4.这里加入自定义的业务转换代码//判断是否为空if (!ObjectUtils.isEmpty(s)) {//分割字符串String[] split = s.split(",");//创建一个Car,并赋值Car car = new Car();car.setName(split[0]);car.setPrice(Double.parseDouble(split[1]));return car;}//这里如果是空就返回一个nullreturn null;}});//5.在这里还可以继续registry.addConverter()添加转换器}};}
}
4.测试

image-20240314183519606

image-20240314183550123

2.注意事项和细节
1.debug查看转换器总数
1.打断点

image-20240314184302880

2.执行到断点后,选左边的192

image-20240314184449540

3.可以看出,加上自定义的转换器一共125个

image-20240314184709199

2.一次新增多个转换器

image-20240314184909592

3.多个转换器的key重复的情况
  • 由于存储转换器的类型为ConcurrentHashMap,key不可以重复
  • 所以一旦定义了多个key相同的转换器则只会保留最后定义的,其余的会被替换

2.处理Json

1.需求分析

image-20240314185604008

2.代码实现
package com.sun.springboot.controller;import com.sun.springboot.bean.Monster;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.Date;/*** @author 孙显圣* @version 1.0*/
@Controller
public class JsonController {//返回json类型的Monster对象@GetMapping("/getMonster")@ResponseBody //将结果转换为json字符串并返回public Monster monsterToJson() {Monster monster = new Monster();monster.setAge(1);monster.setName("sun");monster.setId(1);monster.setCar(null);monster.setBirth(new Date());return monster;}
}
3.测试

image-20240314191020292

3.内容协商

1.基本介绍

image-20240314192453044

2.应用实例
首先在pom.xml引入可以处理xml的依赖
    <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId></dependency>
1.需求分析

image-20240314192811893

2.使用postman测试,修改Accept为application/xml

image-20240314194203290

3.返回的结果是xml类型

image-20240314194228780

4.如果换成原来的任意类型

image-20240314194257446

5.返回的结果是json类型

image-20240314194316016

3.debug当Accept是xml时的源码
1.ctrl + n 找到AbstractJackson2HttpMessageConverter

image-20240314195651832

2.下断点

image-20240314195715255

3.debug启动

image-20240314195914546

4.直接跳到关键部分

image-20240314200214243

5.再跳一下

image-20240314200335605

4.使用浏览器发送请求分析

image-20240314201934172

5.SpringBoot开启基于内容协商的功能
1.需求分析

由于浏览器的Accept不能像postman一样修改,所以,只能根据浏览器默认的权重来决定数据的返回类型

比如:由于浏览器的Accept中xml的权重很高,那就意味着如果后端引用了可以处理xml的依赖,那么后端

就只能给前端返回xml类型的数据,非常不灵活

2.开启基于内容协商的功能 application.yml
spring:mvc:contentnegotiation:favor-parameter: true
3.具体使用

image-20240314203336681

6.内容协商总结
  • 添加了**@ResponseBody**之后,该接口就可以与浏览器进行内容协商
  • 会根据浏览器的Accept的权重来决定优先返回什么类型的数据
  • 由于浏览器的Accept不够灵活,所以可以在SpringBoot中开启基于内容协商的功能,这样只需要在网址后面加上format参数即可决定要返回的类型
SpringBoot中如果只包含JSON相关的依赖(如Jackson),那么返回的数据默认是JSON格式

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

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

相关文章

【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0+微信小程序+云平台

本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-system ✍Gitee开源项目地址&#x1f449;&#xff1a;https://gitee.com/cheinlu/groundhog-charging-system ✨踩坑不易&am…

医学图像目标跟踪论文阅读笔记 2024.03.08~2024.03.14

“Inter-fractional portability of deep learning models for lung target tracking on cine imaging acquired in MRI-guided radiotherapy” 2024年 期刊 Physical and Engineering Sciences in Medicine 医学4区 没资源&#xff0c;只读了摘要&#xff0c;用的是U-net、a…

sqllab第十三关通关笔记

知识点&#xff1a; 登录框处常见的语句(一般都是查询语句) where usernamewhere username""where usernam()where username("")错误注入知识回顾这里使用错误注入 通过admin admin登录发现没有任何回显信息&#xff1b;但是有成功登录的提示 通过bp抓包…

【Python】一文详细介绍 plt.rcParamsDefault 在 Matplotlib 中的原理、作用、注意事项

【Python】一文详细介绍 plt.rcParamsDefault 在 Matplotlib 中的原理、作用、注意事项 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

<Senior High School Math>: inequality question

( 1 ) . o m i t (1). omit (1).omit ( 2 ) . ( a 2 − b 2 ) ( x 2 a 2 − y 2 b 2 ) ( x 2 y 2 ) − ( a 2 y 2 b 2 b 2 x 2 a 2 ) ≤ x 2 y 2 − 2 x y ( x − y ) 2 (2). (a^2-b^2)(\frac{x^2}{a^2} - \frac{y^2}{b^2})(x^2y^2)-(\frac{a^2y^2}{b^2}\frac{b^2x^2}{a^…

Helm Chart部署最简SpringBoot到K8S(AWS EKS版)

目标 这里假设&#xff0c;我们已经基本会使用k8s的kubectl命令进行部署了&#xff0c;也已经会自己打docker镜像推送到AWS ECR上面去了。而且&#xff0c;已经在云上准备好了AWS ECR镜像库和AWS EKS的k8s集群了。 这个前提上面&#xff0c;我们今天使用Helm Chart项目准备k8s…

IT廉连看——Uniapp——模板语法

IT廉连看——Uniapp——模板语法 众所周知&#xff0c;Uniapp是使用vue.js框架开发出来的&#xff0c;所以说它可以使用vue中的语法和指令来开发我们的项目。如果没有学习过vue的话开发起来会比较吃力&#xff0c;所以这节课就带大家学习几个常用的vue知识。如果有学习过vue&a…

在Linux/Ubuntu/Debian中使用7z压缩和解压文件

要在 Ubuntu 上使用 7-Zip 创建 7z 存档文件&#xff0c;你可以使用“7z”命令行工具。 操作方法如下&#xff1a; 安装 p7zip&#xff1a; 如果你尚未在 Ubuntu 系统上安装 p7zip&#xff08;7-Zip 的命令行版本&#xff09;&#xff0c;你可以使用以下命令安装它&#xff1a;…

8-图像放大

其实&#xff0c;就是开辟一个zoomwidth&#xff0c;zoomheight的内存&#xff0c;再分别赋值即可。 void CDib::Maginify(float xZoom, float yZoom) { //指向原图像指针 LPBYTE p_data GetData(); //指向原像素的指针 LPBYTE lpSrc; //指向缩放图像对应像素的指针 LPBYTE l…

机器学习-0X-神经网络

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中神经网络算法。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程化接口实现 参考 机器学习定义 关于机…

jmeter 中用python 实现请求参数的随机

首先需要下载插件来让jmeter支持python脚本 下载地址&#xff1a;https://www.jython.org/download&#xff0c;下载完成后放到jmeter安装目录的lib文件夹下 放置完成后需要重启jmeter&#xff0c;添加JSR223 PreProcessor&#xff0c;Language下拉框中多2项 选择第一项&#…

【CSP试题回顾】201712-2-游戏

CSP-201712-2-游戏 解题思路 代码实现了一个模拟游戏过程的算法&#xff0c;其中n个小朋友围成一圈&#xff0c;按照顺时针方向依次编号从1到n&#xff0c;然后按顺时针方向依次报数。每当报的数是k的倍数或者个位数是k时&#xff0c;报数的小朋友会被淘汰。游戏继续进行&…

unity2D生成9*9格子

1.创建一个空对象和格子 2将格子做成预制体&#xff08;直接将格子拖到这里即可&#xff0c;拖了过后删掉原来的格子&#xff09; 3.创建脚本并将脚本拖到空对象上 using System.Collections; using System.Collections.Generic; using UnityEngine;public class CreateMap : M…

Docker出现容器名称重复如何解决

假如你的重复容器名称是mysql5 删除已存在的容器&#xff1a;如果你不再需要那个已经存在的名为“mysql5”的容器&#xff0c;你可以删除它。使用下面的命令&#xff1a; docker rm -f mysql5这条命令会强制删除正在运行的容器。一旦容器被删除&#xff0c;你就可以重新使用这个…

22-Java状态模式 ( State Pattern )

Java状态模式 摘要实现范例 状态模式&#xff08;State Pattern&#xff09;中类的行为是基于它的状态改变的 在状态模式中&#xff0c;我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象 状态模式属于行为型模式 摘要 1. 意图 允许对象在内部…

操作系统(AndroidIOS)图像绘图的基本原理

屏幕显示图像的过程 我们知道&#xff0c;屏幕是由一个个物理显示单元组成&#xff0c;每一个单元我们可以称之为一个物理像素点&#xff0c;而每一个像素点可以发出多种颜色。 而图像&#xff0c;就是在不同的物理像素点上显示不同的颜色构成的。 像素点的颜色 像素的颜色是…

PyCharm创建一个简单的Django项目

1.Django简介 Django 是一个开放源代码的 Web 应用程序框架&#xff0c;由 Python 编写而成。它遵循 MVC&#xff08;模型-视图-控制器&#xff09;的软件设计模式&#xff0c;采用了 MTV&#xff08;模型-模板-视图&#xff09;的架构。Django 的设计目标是使开发复杂的、数据…

《ElementPlus 与 ElementUI 差异集合》el-input 多包裹一层 el-input__wrapper

差异 element-ui el-input 中&#xff0c;<div class"el-input"> 下一级就是 <input> 标签 &#xff1b;element-plus el-input中&#xff0c;<div class"el-input"> 和 <input> 标签之间多了一层 <div class"el-input__…

Jmeter+ant,ant安装与配置

1.ant含义 ant&#xff1a;Ant翻译过来是蚂蚁的意思&#xff0c;在我们做接口测试的时候&#xff0c;是可以用来做JMeter接口测试生成测试报告的工具 2.ant下载 下载地址&#xff1a;Apache Ant - Ant Manual Distributions download中选择ant 下载安装最新版zip文件 3.…

浅谈路由器基本结构与工作原理

目录 一、结构 1.1 输入端口 1.2 交换结构 1.3 输出端口 1.4 路由选择处理器 二、输入端口处理和基于目的地转发 三、交换 四、输出端口处理 五、何时出现排队 5.1 输入排队 5.2 输出排队 一、结构 下图是一个通用路由器体系结构的总体试图视图&#xff0c;其主要由…