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

文章目录

    • 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.mzph.cn/news/745480.shtml

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

相关文章

分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测

分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测 目录 分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GSWOA-KELM分类&#xff0…

react04- mvc 、 mvvm

MVC与MVVM stackoverflow论坛网站 react前端框架 使用框架前&#xff1a; 操作dom > js获取dom元素&#xff0c;事件侦听&#xff0c;修改数据&#xff0c;设置样式。。。 操作dom问题: 直接操作dom&#xff0c;会造成大量的回流、重绘&#xff0c;消耗大量性能操作起来也…

论文阅读——RingMo

RingMo: A Remote Sensing Foundation Model With Masked Image Modeling 与自然场景相比&#xff0c;RS图像存在以下困难。 1&#xff09;分辨率和方位范围大&#xff1a;受遥感传感器的影响&#xff0c;图像具有多种空间分辨率。此外&#xff0c;与自然图像的实例通常由于重…

尚硅谷SpringBoot3笔记 (二) Web开发

Servlet&#xff0c;SpringMVC视频推荐&#xff1a;53_尚硅谷_servlet3.0-简介&测试_哔哩哔哩_bilibili HttpServlet 是Java Servlet API 的一个抽象类&#xff0c;用于处理来自客户端的HTTP请求并生成HTTP响应。开发人员可以通过继承HttpServlet类并重写其中的doGet()、do…

【图论】计算图的n-hop邻居个数,并绘制频率分布直方图

计算图的n-hop邻居个数&#xff0c;并绘制频率分布直方图 在图论中&#xff0c;n-hop邻居&#xff08;或称为K-hop邻居&#xff09;是指从某个顶点出发&#xff0c;通过最短路径&#xff08;即最少的边数&#xff09;可以到达的所有顶点的集合&#xff0c;其中n&#xff08;或…

JVM及垃圾回收算法

一、JVM 1、jvm的内存组成 五大内存区域&#xff0c;分1.7和1.8 1.堆内存&#xff1a;引用类型的数据&#xff0c;内部组成&#xff1a;1.新生代&#xff08;伊甸区和幸存者区&#xff09;2.老年代。该区域经常发生垃圾回收的操作 堆是JVM中最大的一块内存区域&#xff0c;用…

【爬虫】requests.post请求中的data和json使用区别

请求体是键值对形式&#xff08;无花括号&#xff09;&#xff0c;请求时需要使用data参数处理。 代码&#xff1a; data {...} ret requests.post(url, headersheaders, datadata)请求体是字典形式&#xff08;有花括号&#xff09;&#xff0c;请求时需要使用json参数处理。…

派对游戏2024年新局面:二超多强,市场细分

2023年末&#xff0c;《元梦之星》上线迎战《蛋仔派对》&#xff0c;网腾大战打响。 这场战役从开局就进入到了白热化&#xff0c;双方投入真金白银来拉拢玩家&#xff0c;于春节这一亲朋相聚最适合派对游戏的时段集中发力&#xff0c;互有胜负。 目前《元梦之星》略处下风&a…

Principled Instructions Are All You Need for Questioning LLaMA-1/2, GPT-3.5/4

Principled Instructions Are All You Need for Questioning LLaMA-1/2, GPT-3.5/4 相关链接&#xff1a;arxiv 关键字&#xff1a;Questioning LLaMA、GPT-3.5/4、guiding principles、prompting、large language models 摘要 本文介绍了26个旨在简化查询和提示大型语言模型&…

自然语言处理NLP:tf-idf原理、参数及实战

大家好&#xff0c;tf-idf作为文体特征提取的常用统计方法之一&#xff0c;适合用于文本分类任务&#xff0c;本文将从原理、参数详解和实际处理方面介绍tf-idf&#xff0c;助力tf-idf用于文本数据分类。 1.tf-idf原理 tf 表示词频&#xff0c;即某单词在某文本中的出现次数与…

力扣 322 零钱兑换

题目描述 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 你可以认为每种硬币的数量是无限的。 示例 1&#xff1a; 输入&#xff1a;coins [1, 2, 5…

x6.js 从流程图组件库中拖拽组件到画布dnd使用

上一篇已经了解到了x6.js常用功能以及使用方法。但我们使用流程图的时候还少不了一个非常重要的功能那就是拖拽组件库里的组件进来。如下图&#xff1a; 首先是布局这块&#xff0c;拖拽组件库的视图中布局无需我们去写&#xff0c;我们只需把界面搭建好。 添加组件库 1.搭建布…

Python 基于 OpenCV 视觉图像处理实战 之 图像相关的基本概念,以及图像的基础操作 二

Python 基于 OpenCV 视觉图像处理实战 之 图像相关的基本概念&#xff0c;以及图像的基础操作 二 目录 Python 基于 OpenCV 视觉图像处理实战 之 图像相关的基本概念&#xff0c;以及图像的基础操作 二 一、简单介绍 二、图像的几何变换 三、插值算法 1、最近邻插值算法 …

java kafka客户端何时设置的kafka消费者默认值

kafka为什么有些属性没有配置却能正常工作&#xff0c;那是因为kafka-clients对有些消费者设置了默认值&#xff0c;具体看下ConsumerConfig类的静态模块&#xff0c;具体如下所示&#xff1a; kafka为什么有些属性没有配置却能正常工作&#xff0c;那是因为kafka-clients对有…

AJAX 02 案例、Bootstrap框架

AJAX 学习 AJAX 2 综合案例黑马 API01 图书管理Bootstrap 官网Bootstrap 弹框图书管理-渲染列表图书管理-添加图书图书管理-删除图书图书管理 - 编辑图书 02 图片上传03 更换图片04 个人信息设置信息渲染头像修改补充知识点&#xff1a;label扩大表单的范围 AJAX 2 综合案例 黑…

【FPGA】DDR3学习笔记(二)丨从SDRAM到DDR3的IP核设计

本篇文章包含的内容 一、DDR SDRAM1.1 基本概述1.2 工作时序&#xff08;以读取为例&#xff09; 二、DDR2 SDRAM2.1 基本概述2.2 工作时序 三、DDR3 SDRAM3.1 基本概述3.2 硬件设计3.3 读写时序3.4 MIG IP核设计3.5 读写代码设计 开发板&#xff1a;正点原子的达芬奇开发板&am…

【Leetcode每日一题】 递归 - 合并两个有序链表(难度⭐)(35)

1. 题目解析 题目链接&#xff1a;21. 合并两个有序链表 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 1. 递归函数定义与功能 递归函数的主要任务是将两个有序链表合并成一个新的有序链表&#xff0c;并返回合并后…

Git 学习笔记 三个区域、文件状态、分支、常用命令

Git 学习 GitGit概念VS Code中使用仓库&#xff08;repository&#xff09;示例 Git 使用时的三个区域示例 Git 文件状态示例 Git 暂存区示例 Git 回退版本删除文件忽略文件示例 分支分支的使用分支的合并与删除分支的合并冲突 Git常用命令Git远程仓库 (HTTP)步骤远程仓库 克隆…

【Linux】Linux命令速查表

Linux 命令列表 – 目录 文件和目录操作命令 文件权限命令文件压缩和归档命令进程管理命令系统信息命令 联网命令 IO重定向命令环境变量命令 用户管理命令 快捷键命令列表 Bash 快捷键命令 Nano 快捷键命令 VI 快捷键命令 Vim 快捷键命令Linux 命令备忘单常见问题解答 1. 文件和…

[linux]信号处理:信号编码、基本API、自定义函数和集合操作的详解

一、信号的概述 1、定义 信号是 Linux 进程间通信的最古老的方式。信号是软件中断&#xff0c;它是在软件层次 上对中断机制的一种模拟&#xff0c;是一种异步&#xff08;不等待&#xff09;通信的方式 。信号可以导致一个正在运行的进程被 另一个正在运行的异步进程中断&a…