Spring Boot中如何扩展XML请求和响应的支持

在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理。那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式返回一个对象呢?

实现原理:消息转换器(Message Converter)

在扩展上述问题之前,我们先要知道Spring Boot中处理HTTP请求的实现是采用的Spring MVC。而在Spring MVC中有一个消息转换器这个概念,它主要负责处理各种不同格式的请求数据进行处理,并包转换成对象,以提供更好的编程体验。

在Spring MVC中定义了HttpMessageConverter接口,抽象了消息转换器对类型的判断、对读写的判断与操作,具体可见如下定义:

public interface HttpMessageConverter<T> {

boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);

boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);

List<MediaType> getSupportedMediaTypes();

T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;

void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;

}

众所周知,HTTP请求的Content-Type有各种不同格式定义,如果要支持Xml格式的消息转换,就必须要使用对应的转换器。Spring MVC中默认已经有一套采用Jackson实现的转换器MappingJackson2XmlHttpMessageConverter

扩展实现

第一步:引入Xml消息转换器

在传统Spring应用中,我们可以通过如下配置加入对Xml格式数据的消息转换实现:

@Configuration
public class MessageConverterConfig1 extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
builder.indentOutput(true);
converters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
}
}

在Spring Boot应用不用像上面这么麻烦,只需要加入jackson-dataformat-xml依赖,Spring Boot就会自动引入MappingJackson2XmlHttpMessageConverter的实现:

<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>

同时,为了配置Xml数据与维护对象属性的关系所要使用的注解也在上述依赖中,所以这个依赖也是必须的。

第二步:定义对象与Xml的关系

做好了基础扩展之后,下面就可以定义Xml内容对应的Java对象了,比如:

@Data
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "User")
public class User {

@JacksonXmlProperty(localName = "name")
private String name;
@JacksonXmlProperty(localName = "age")
private Integer age;

}

其中:@Data@NoArgsConstructor@AllArgsConstructor是lombok简化代码的注解,主要用于生成get、set以及构造函数。@JacksonXmlRootElement@JacksonXmlProperty注解是用来维护对象属性在xml中的对应关系。

上述配置的User对象,其可以映射的Xml样例如下(后续可以使用上述xml来请求接口):

<User>
<name>aaaa</name>
<age>10</age>
</User>

第三步:创建接收xml请求的接口

完成了要转换的对象之后,可以编写一个接口来接收xml并返回xml,比如:

@Controller
public class UserController {

@PostMapping(value = "/user",
consumes = MediaType.APPLICATION_XML_VALUE,
produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public User create(@RequestBody User user) {
user.setName("didispace.com : " + user.getName());
user.setAge(user.getAge() + 100);
return user;
}

}

最后,启动Spring Boot应用,通过POSTMAN等请求工具,尝试一下这个接口,可以看到请求Xml,并且返回了经过处理后的Xml内容。

案例代码

可以通过下面两个仓库中查阅chapter3-1-8目录:

  • Github
  • Gitee

以下专题教程也许您会有兴趣

  • Spring Boot基础教程
  • Spring Cloud基础教程

money.jpg

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

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

相关文章

我在斯坦福做的科研demo…要被导师带去美国国会演讲?

文 | Jazon编 | 小戏大家好&#xff0c;我是 Jazon。时光荏苒&#xff0c;一转眼我已经快要从 Stanford CS 系毕业了。今年7月&#xff0c;我将开始谷歌总部工作&#xff0c;短期内会在硅谷定居&#xff0c;湾区的朋友们欢迎约起呀。笔者去年写过一篇文章&#xff0c;分享了我研…

剑指Offer - 面试题21. 调整数组顺序使奇数位于偶数前面(双指针,原地算法)

1. 题目 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 示例&#xff1a; 输入&#xff1a;nums [1,2,3,4] 输出&#xff1a;[1,3,2,4] 注&#xff1a;[3,1,2,4]…

使用Cloud Studio在线编写、调试和管理Spring Boot应用

在之前的《Spring Boot基础教程》中&#xff0c;我们介绍了通过Spring官方的构建页面来生成项目&#xff0c;也介绍了通过使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程。在完成了基础项目构建之后&#xff0c;我们要开始进行的就是代码的开发阶段&#x…

神TM的SOTA ,看完谷歌的新论文,我对AI大厂有些失望

源 | 机器之心用数万美元 TPU 算力&#xff0c;实现在 CIFAR-10 上 0.03% 的改进&#xff0c;创造了新的 SOTA&#xff0c;但这一切值得吗&#xff1f;「我相信他们得到的数字是准确的&#xff0c;他们确实做了工作并得到了结果…… 但这样真的好吗&#xff1f;」一名机器学习研…

Springboot 2.0选择HikariCP作为默认数据库连接池的五大理由

转载自公众号&#xff1a;工匠小猪猪的技术世界 摘要: 本文非原创&#xff0c;是笔者搜集了一些HikariCP相关的资料整理给大家的介绍&#xff0c;主要讲解了为什么sb2选择了HikariCP以及HikariCP为什么这么快。 Springboot2默认数据库连接池选择了HikariCP为何选择HikariCP理由…

剑指Offer - 面试题13. 机器人的运动范围(BFS/DFS)

文章目录1. 题目2. 解题2.1 BFS2.2 DFS1. 题目 地上有一个m行n列的方格&#xff0c;从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动&#xff0c;它每次可以向左、右、上、下移动一格&#xff08;不能移动到方格外&#xff09;&#xff0c;也不能进入…

聊聊“润(run)”

文 | One day知乎大家好&#xff0c;我是one day。前不久&#xff0c;我和知乎大V陈然老师在广州的台风天上午&#xff0c;线上聊了一杯咖啡时间的天&#xff0c;老师帮忙解答了一些疑虑&#xff0c;share了一些自己的想法。主要是围绕 美国湾区互联网工作氛围、大厂&创业公…

Spring Boot使用@Async实现异步调用:使用Future以及定义超时

之前连续写了几篇关于使用Async实现异步调用的内容&#xff0c;也得到不少童鞋的反馈&#xff0c;其中问题比较多的就是关于返回Future的使用方法以及对异步执行的超时控制&#xff0c;所以这篇就来一起讲讲这两个问题的处理。 如果您对于Async注解的使用还不了解的话&#xf…

《程序员面试金典》解题目录(更新完毕)

题目来源于LeetCode上的《程序员面试金典》&#xff0c;这里做一个目录方便大家查找。另外有本人的LeetCode解题目录、《剑指Offer》解题目录、LintCode代码能力测试CAT 解题目录可点击链接查看。updated on 2020.4.17 不懂的概念可以参考《数据结构与算法之美》学习汇总 已解…

我竟在一篇AI顶会论文里见到了小猪佩奇...

声明&#xff1a;本文原创首发于公众号夕小瑶的卖萌屋。作者&#xff1a;智商掉了一地--->【我是传送门】&#xff0c;内含海量CV/NLP/ML入门资料、必刷综述、前沿论文解读、交流社群、offer神器、学习神器等在介绍接下来的内容前&#xff0c;我们先来看一则笑话&#xff1a…

程序员面试金典 - 面试题 01.01. 判定字符是否唯一(位运算,牛)

1. 题目 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a; 输入: s "leetcode" 输出: false 示例 2&#xff1a; 输入: s "abc" 输出: true限制&#xff1a; 0 < len(s) < 100 如果你不使用额外的数据结构…

Spring Boot快速开发利器:Spring Boot CLI

Spring Boot CLI&#xff08;Command Line Interface&#xff09;是一个命令行工具&#xff0c;您可以用它来快速构建Spring原型应用。通过Spring Boot CLI&#xff0c;我们可以通过编写Groovy脚本来快速的构建出Spring Boot应用&#xff0c;并通过命令行的方式将其运行起来。下…

微软发现了一个超简单的NLP上分技巧,还发了ACL2022 ??

文 | QvQ编 | Sheryc_王苏今天给大家介绍一篇来自工业界巨头微软的工作&#xff0c;这篇论文真是把资本家的嘴脸暴露的一览无余&#xff1a;用最低的成本&#xff0c;创造最高的收益&#xff08;狗头.jpg&#xff09;文章从头到尾就阐述了一个结论&#xff1a;通过在输入文本中…

程序员面试金典 - 面试题 01.05. 一次编辑(编辑距离,DP)

1. 题目 字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串&#xff0c;编写一个函数判定它们是否只需要一次(或者零次)编辑。 示例 1: 输入: first "pale" second "ple" 输出: True示例 2: 输入: first "pa…

Spring Boot使用@Async实现异步调用:ThreadPoolTaskScheduler线程池的优雅关闭

上周发了一篇关于Spring Boot中使用Async来实现异步任务和线程池控制的文章&#xff1a;《Spring Boot使用Async实现异步调用&#xff1a;自定义线程池》。由于最近身边也发现了不少异步任务没有正确处理而导致的不少问题&#xff0c;所以在本文就接前面内容&#xff0c;继续说…

MIT毕业生亲述:在Deepmind打工是一种什么样的体验?

文 | Akhil Raju源 | 机器之心在这里&#xff0c;既有头脑风暴&#xff0c;也有生活气息。本月初&#xff0c;时任苹果机器学习总监的 Ian Goodfellow 宣布在加入公司三年后辞职&#xff0c;没过几天&#xff0c;就有消息曝出大神去向定了&#xff0c;他将重返谷歌加入 DeepMin…

LeetCode 72. 编辑距离(DP)

1. 题目 给定两个单词 word1 和 word2&#xff0c;计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1: 输入: word1 "horse", word2 "ros" 输出: 3 解…

毕业后到底去学术界还是工业界?杜克大学陈怡然教授亲述5条“小秘籍”

文 | 卖萌酱大家好&#xff0c;我是卖萌酱。今天和大家聊一个非常受关心的话题&#xff1a;毕业到底是去学术界还是工业&#xff1f;刚好最近看到杜克大学陈怡然教授在微博上对此有亲身感悟&#xff1a;陈怡然教授认为回学校而不去公司有以下几个理由&#xff1a;1. 我不喜欢随…

程序员面试金典 - 面试题 17.11. 单词距离(multimap平衡二叉搜索树)

1. 题目 有个内含单词的超大文本文件&#xff0c;给定任意两个单词&#xff0c;找出在这个文件中这两个单词的最短距离(相隔单词数)。 如果寻找过程在这个文件中会重复多次&#xff0c;而每次寻找的单词不同&#xff0c;你能对此优化吗? 示例&#xff1a; 输入&#xff1a;w…

腾讯薪酬改革来了!晋升≠加薪?员工到底为何工作?

文 | 天于刀刀这届打工人真的是太太太难了&#xff01;朝九晚九地写PPT&#xff0c;熬KPI&#xff0c;疫情它来了&#xff1b;终于习惯了隔离核酸&#xff0c;走出EMO&#xff0c;隔壁工位的同学被毕业了&#xff1b;最终凭着玄学幸运留组&#xff0c;还没来得及准备庆祝一下六…