学透Spring Boot — 018. 优雅支持多种响应格式

这是我的专栏《学透Spring Boot》的第18篇文章,想要更系统的学习Spring Boot,请访问我的专栏:学透 Spring Boot_postnull咖啡的博客-CSDN博客。

目录

返回不同格式的响应

Spring Boot的内容协商

控制器不用任何修改

启动内容协商配置

访问应用

获取XML格式的响应

添加XML的支持

设置变量名

配置其它的格式

总结


Spring MVC中会根据@GetMapping或者@RequestMapping中的路径,匹配对应的HTTP请求到指定的方法去,这个我们不再累述。

今天我们玩点更特别的。

返回不同格式的响应

有时候,我们希望我们的响应,既可以返回json格式,也可以返回xml格式。

返回什么格式,由我们的参数来决定。

最傻的办法,是在Controller中,解析format参数,然后用XML或者Json解析器把对象转换成json或者XML格式。

这样当然可以,但是有点不够优雅。

Spring Boot的内容协商

好在,Spring Boot已经帮我实现了这样的特性,支持不同格式的响应。

控制器不用任何修改

控制器不用做任何修改,甚至连format参数都不用加。

启动内容协商配置

application.properties

spring.mvc.contentnegotiation.favor-parameter=true

访问应用

然后我们可以带参数获取不同的响应。

http://localhost:8080/buyBike?format=json

返回了json响应

不带format参数,返回的也是json。这是默认格式。

获取XML格式的响应

然后我们再获取xml响应:http://localhost:8080/buyBike?format=xml

非常可惜,情况有点异常。报错了。

查看日志,发现支持的格式中居然没有application/xml.

这是怎么回事呢?

我们debug看看,启动时看看WebMvcConfigurer (Spring MVC配置器)加载了哪些http消息转换器。

要深入了解HTTP消息转换器,请看我上一篇的文章学透Spring Boot — 017. 魔术师—Http消息转换器-CSDN博客

可以看到,SpringBoot只配置了json的转换器。

我们再看看jackson的自动配置类

可以看到,要配置Jackson XML,就classpath下必须有XmlMapper类。

很可惜Spring Boot默认没有引入这个类。

添加XML的支持

为了支持XML的响应,我们需要引入XML相关的依赖。

这时候有了XmlMapper类,我们的Jackson也会去自动配置XML转换器了。

我们重启服务,debug,再看看加载的消息转换器列表。

下图可以看出,Jackson XML的消息转换器已经自动配置并加载了。

再次访问,成功返回xml的响应!!!

设置变量名

其实我们还可以做得在多一点。比如我不喜欢format这个变量,我想改成good

spring.mvc.contentnegotiation.parameter-name=good

完全OK

配置其它的格式

如果我还想配置其它的格式,也是可以的。比如我们前面文章自主研发的格式“hehe/nba”

spring.mvc.contentnegotiation.media-types.hehe-nbc=hehe/nba

访问有问题可能是因为你的格式不在支持的列表中

RequestResponseBodyMethodProcessor : Using 'hehe/nba;charset=UTF-8', given [hehe/nba] and supported [application/json, application/*+json, application/xml;charset=UTF-8, text/xml;charset=UTF-8, application/*+xml;charset=UTF-8, hehe/nba;charset=UTF-8, hehe/nba]

而且我们开发的hehe/nba格式,暂时只处理了Car类。

总结

本文,我们自己通过内容协商,实现了返回多种格式响应的需求,而且不用改动任何业务代码,只需做少量配置即可。另外,我们也通过引入XML的依赖,实现了Spring Boot对Jackson XML的自动配置。

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

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

相关文章

ngx_os_init

定义在 src\os\unix\ngx_posix_init.c ngx_int_t ngx_os_init(ngx_log_t *log) {ngx_time_t *tp;ngx_uint_t n; #if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long size; #endif#if (NGX_HAVE_OS_SPECIFIC_INIT)if (ngx_os_specific_init(log) ! NGX_OK) {return NGX_ERR…

深信服护网蓝初面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

游戏引擎学习第206天

回顾并为当天的工作定下目标 接着回顾了前一天的进展。之前我们做了一些调试功能,并且已经完成了一些基础的工作,但是还有一些功能需要继续完善。其中一个目标是能够展示实体数据,以便在开发游戏逻辑系统时,可以清晰地查看和检查…

HTML 表单:构建交互式网页的关键元素

HTML 表单:构建交互式网页的关键元素 引言 HTML表单是构建交互式网页的核心组件之一,它允许用户与网站进行交互,提交信息、填写问卷或进行其他操作。本文将深入探讨HTML表单的基础知识、常用元素、表单验证以及如何优化表单设计,以提高用户体验和网站的可访问性。 HTML表…

Qt音频采集:QAudioInput详解与示例

1. 简介 QAudioInput是Qt Multimedia模块中用于音频采集的核心类,能够从麦克风等输入设备实时获取原始音频数据(PCM格式)。本文将通过原理讲解和代码示例,帮助开发者快速掌握音频采集的核心技术。 2. 核心功能 支持多种音频格式&…

下载安装Node.js及其他环境

提示:从Node版本降级到Vue项目运行 文章目录 下载Node.js环境配置配置环境变量 安装 cnpm(我需要安装)安装脚手架安装依赖安装淘宝镜像(注意会更新)cnpm vs npm 与新旧版本核心差异包管理器不同功能差异如何选择&#…

【后端】ORM / ODM

长期不定期更新,建议关注收藏点赞。 概述 ORM(Object-Relational Mapping,对象关系映射):面向关系型数据库,ORM将对象映射到数据库的表和行(例如MySQL、PostgreSQL)。ODM&#xff0…

无限滚动(Infinite Scroll)页面谷歌不收录!必须改回分页吗?

近三年,全球超过58%的网站采用无限滚动设计(数据来源:PageTraffic 2023) 谷歌官方数据显示,动态加载内容的索引失败率高达73%(Google Webmaster Report 2022),而采用纯无限滚动的页…

手写JSX实现虚拟DOM

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…

网络性能优化参数关系解读 | TCP Nagle / TCP_NODELAY / TCP_QUICKACK / TCP_CORK

注:本文为 “网路性能优化” 相关文章合辑。 未整理去重。 如有内容异常,请看原文。 TCP_NODELAY 详解 lenky0401 发表于 2012-08-25 16:40 在网络拥塞控制领域,Nagle 算法(Nagle algorithm)是一个非常著名的算法&…

玄机-应急响应-webshell查杀

题目要求: 要求获取四个flag webshell查杀: 常见的webshell: PHP: eval(), system(), exec(), shell_exec(), passthru(), assert(), base64_decode() ASP: Execute(), Eval(), CreateObject() JSP: Runtime.getRuntime().exec() websh…

docker存储卷及dockers容器源码部署httpd

1. COW机制 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本依然存在,只是已经被读写层中该文件…

PyTorch中卷积层torch.nn.Conv2d

在 PyTorch 中,卷积层主要由 torch.nn.Conv1d、torch.nn.Conv2d 和 torch.nn.Conv3d 实现,分别对应一维、二维和三维卷积操作。以下是详细说明: 1. 二维卷积 (Conv2d) - 最常用 import torch.nn as nn# 基本参数 conv nn.Conv2d(in_channe…

从 ZStack 获取物理机与云主机信息并导出 Excel 文件

文章目录 从 ZStack 获取物理机与云主机信息并导出 Excel 文件环境zstack 官网客户端封装讲解 获取物理机信息讲解 获取云主机信息并关联物理机讲解 导出数据到 Excel 文件讲解 运行主程序讲解 总结最终文档效果完整代码 从 ZStack 获取物理机与云主机信息并导出 Excel 文件 在…

5.好事多磨 -- TCP网络连接Ⅱ

前言 第4章节通过回声服务示例讲解了TCP服务器端/客户端的实现方法。但这仅是从编程角度的学习,我们尚未详细讨论TCP的工作原理。因此,将详细讲解TCP中必要的理论知识,还将给出第4章节客户端问题的解决方案。 一、回声客户端完美实现 第4章…

sql server数据库可疑修复

sql server数据库可疑修复 从上图可以看到数据库nchrdb显示可疑,导致原因为NC系统在增加公共薪资项目的时候,扩展字段报错了,第一次遇到这种情况,折腾了很久终于解决,记下解决方案: 1,将SQL数据…

Flutter之页面布局二

目录: 1、列表布局1.1、基础列表1.2、水平滑动的列表1.3、网格列表1.3、不同列表项的列表1.4、包含间隔的列表1.6、长列表 2、滚动2.1、浮动的顶栏2.2、平衡错位滚动 1、列表布局 1.1、基础列表 import package:flutter/material.dart;void main() > runApp(con…

ARM------硬件程序开发

硬件程序开发流程 相关硬件的工作原理 理解硬件的工作原理,明确硬件的功能和用途。 硬件连接 将硬件设备正确连接到开发板上。 编写程序 根据硬件功能编写相应的程序代码。 调试验证 通过调试工具验证程序的正确性,确保硬件功能正常。 控制LED的…

《QT从基础到进阶·七十四》Qt+C++开发一个python编译器,能够编写,运行python程序改进版

1、概述 源码放在文章末尾 根据上一篇文章回顾下利用QtC实现了一个简易的python编译器,类似pycharm或vsCode这样的编译器,该python编译器目前实现了如下功能: (1)支持编写python程序 (2)编写代…

Winform MQTT客户端连接方式

项目中使用到Winform的数据转发服务,所以记录下使用到的方法。 一.创建单例模板 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp.Scripts {public class SingleTon&…