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
    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        //1.使用匿名内部类来实现WebMvcConfigurer接口的方法,并返回对象
        return new WebMvcConfigurer() {
            @Override
            //2.实现addFormatters方法
            public void addFormatters(FormatterRegistry registry) {
                //3.调用addConverter方法,然后使用匿名内部类实现Converter接口的方法,里面的泛型就是从什么类型转换到什么类型
                registry.addConverter(new Converter<String , Car>() {
                    @Override
                    public 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;
                        }
                        //这里如果是空就返回一个null
                        return 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格式

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

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

相关文章

Day63:WEB攻防-JS应用算法逆向三重断点调试调用堆栈BP插件发包安全结合

目录 前置知识 JS调试分析 JS分析调试结合Burp JS分析调试知识点&#xff1a; 1、JavaScript-作用域&调用堆栈 2、JavaScript-断点调试&全局搜索 3、JavaScript-Burp算法模块使用 前置知识 JS加密数据走向 浏览器调试 1、作用域&#xff1a;&#xff08;本地&全…

论文阅读——RingMo

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

《1w实盘and大盘基金预测 day3》

上贴指数预测拉满&#xff0c;上证最低位置和最高位置预测的八九不离十&#xff0c;个人预测最高3062实际3060&#xff0c;最低3017实际3020 昨天的预测 3017-3031-3062 低开反抽&#xff0c;回落下杀 明天看是否能阳包阴&#xff0c;得看蓝筹、证券发力。&#xff08;AI板块…

对OceanBase进行 sysbench 压测前,如何用 obdiag巡检

有一些用户想对 OceanBase 进行 sysbench 压测&#xff0c;并向我询问是否需要对数据库的各种参数进行调整。我想起有一个工具 obdiag &#xff0c;具备对集群进行巡检的功能。因此&#xff0c;我正好借此机会试用一下这个工具。 obdiag 功能的比较丰富&#xff0c;详细情况可参…

【机器学习300问】37、什么是迁移学习?

一、什么是迁移学习&#xff1f; &#xff08;1&#xff09;它的出现是为了解决什么问题&#xff1f; 迁移学习是为了解决深度学习中由于数据不足导致的学习效果受限以及跨领域知识的有效利用等问题而发展起来的一种重要技术手段。 ① 缺少训练数据 在许多实际应用中&#xf…

手动创建线程池各个参数的意义?

今天我们学习线程池各个参数的含义&#xff0c;并重点掌握线程池中线程是在什么时机被创建和销毁的。 线程池的参数 首先&#xff0c;我们来看下线程池中各个参数的含义&#xff0c;如表所示线程池主要有 6 个参数&#xff0c;其中第 3 个参数由 keepAliveTime 时间单位组成。…

DM数据库安装(Linux)

Linux安装 操作系统CPU数据库CentOS7x86_64 架构dm8_20230418_x86_rh6_64 先把压缩包扔过去 新建 dmdba 用户 创建用户所在的组&#xff0c;命令如下&#xff1a; groupadd dinstall 创建用户&#xff0c;命令如下&#xff1a; useradd -g dinstall -m -d /home/dmdba -s /…

MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的通信协议&#xff0c;在物联网和消息传递系统中广泛应用。MQTT 提供了三个不同的 QoS&#xff08;Quality of Service&#xff09;等级&#xff0c;用于确保消息的可靠性和传输效率。本文将详细…

java数据结构与算法刷题-----LeetCode47. 全排列 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 暴力回溯2. 分区法回溯 此题为46题的衍生题&#xff0c;在46题…

Android14之报错:error:add its name to the whitelist(一百九十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Vscode 修改C++版本

1. 首先要检查GCC版本&#xff0c;有的gcc版本过低会导致C版本升级不成功 可以用cmd&#xff0c;用gcc --version命令查看gcc版本 我这里就是gcc版本较低&#xff0c;不支持c17 需要先升级gcc版本 gcc与c对应的版本&#xff0c;大家可以在这位大佬的博客中看&#xff0c;写…

json-server库的使用,实现数据模拟

项目目录 安装 npm i json-server -g 启动单个json服务&#xff0c;在cookbook目录下执行命令&#xff1a; json-server ./mock/a.json -p 9000 待实现

本地调试 Github Actions:维护纯净代码,减少调测记录 | 开源日报 No.200

nektos/act Stars: 47.6k License: MIT act 是一个可以在本地运行 GitHub Actions 的工具。 快速反馈&#xff1a;无需每次都提交/推送更改到 .github/workflows/ 文件&#xff08;或嵌入式 GitHub actions&#xff09;&#xff0c;使用 act 可以在本地运行 actions&#xff…

【华为 ICT HCIA eNSP 习题汇总】——题目集16

1、下面哪一个最适合使用室内分布方式部署 WLAN&#xff1f; A、运动场 B、办公室 C、高校单排宿舍 D、广场 考点&#xff1a;无线局域网 解析&#xff1a;&#xff08;C&#xff09; 室内分布方式部署 WLAN 一般适用于需要大面积、高密度、高质量无线覆盖的场所&#xff0c;从…

<JavaEE> 数据链路层 -- 以太网协议、MTU限制、ARP协议

目录 以太网协议 什么是以太网&#xff1f; 以太网的帧格式 什么是MAC地址&#xff1f; MAC地址和IP地址的对比&#xff1f; MTU&#xff08;最大传输单元&#xff09;限制 什么是MTU限制&#xff1f; MTU对IP协议有什么影响&#xff1f; MTU对UDP协议有什么影响&…

Css提高——flex布局及其相关属性

目录&#xff1a; 1、传统布局与flex布局的区别 2、flex的布局原理 3、flex常见的父项属性 3.1、flex-direction &#xff1a;设置主轴的方向 3.2、justify-content 设置主轴上的子元素排列方式 3.3、flex-wrap 设置子元素是否换行 3.4、align-items 设置侧轴上的子元素排…

电阻器的等效电路与高频无感电阻的性能

电阻器的结构比较简单&#xff0c;但在高频情况下&#xff0c;不能简单地把电阻器看成只是一个电阻分量的理想元件。电阳器实际上是由许多电阻、电感和电容分量组成的复杂阻抗系统&#xff0c;电阻只是其中的一个主要成分。因此必须研究电阻器的直流等效电路、高频等效电路和集…

面试题系列一之-css画三角形(原理解析)

用html写一个三角形的图标算是一个比较简单的,但是工作中用的还是比较多的&#xff0c;面试也可能会问&#xff0c;但了解背后的原理才能熟练使用 我们首先写一个div,设置边框 <body><div class"border"></div> </body> <style> .bo…

HNU计算机系统·汇编进阶

知识回顾&#xff1a; 寻址&#xff1a; 其中&#xff0c;比例因子S&#xff0c;只能是1&#xff0c;2&#xff0c;4&#xff0c;8中的数&#xff0c;这是因为在LEA的独立电路中使用移位寄存器 上节课的补充&#xff1a; mov部分: mov value , %eax mov $value , %eax 第一条…

Python数据分析-5

1.时间序列 2.pandas重采样 重采样&#xff1a;指的是将时间序列从一个频率转化为另一个频率进行处理的过程&#xff0c;将高频率数据转化为低频率数据为降采样&#xff0c;低频率转 化为高频率为升采样。 统计出911数据中不同月份电话次数的变化情况&#xff1a…