在之前的所有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 {@Overridepublic 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)@ResponseBodypublic User create(@RequestBody User user) {user.setName("didispace.com : " + user.getName());user.setAge(user.getAge() + 100);return user;}}

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

是时候转型 Serverless 来玩微服务了吗?

本系列教程《Spring Boot 2.x基础教程》:https://blog.didispace.com/spring-boot-learning-2x/

学习过程中如遇困难,建议加入Spring技术交流群,参与交流与讨论,更好的学习与进步!如何加入?点击下方卡片,回复关键词「加群」即可!

代码示例

本文的相关例子可以查看下面仓库中的chapter2-8目录:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/

  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/

往期推荐

是时候转型 Serverless 来玩微服务了吗?

还在用Jenkins?看看这些替代方案,是否更适合你!

Spring 面试题(2021最新版)赶紧收藏!

因一次骑行的脸刹着地,诞生了自动驾驶自行车!不愧是野生钢铁侠!太硬核了~~~

腾讯试点强制6点下班!标志着反996、反内卷的第一枪吗?

Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应相关推荐

  1. Spring Boot 2.x基础教程:使用国产数据库连接池Druid

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  2. Spring Boot 2.x基础教程:使用Elastic Job的分片配置

    上一篇,我们介绍了如何使用Elastic Job实现定时任务(https://blog.didispace.com/spring-boot-learning-2-7-2/).解决了使用@Schedul ...

  3. Spring Boot 2.x基础教程:使用Elastic Job实现定时任务

    上一篇,我们介绍了如何使用Spring Boot自带的@Scheduled注解实现定时任务(https://blog.didispace.com/spring-boot-learning-2-7-1/ ...

  4. Spring Boot 2.x基础教程:使用Redis的发布订阅功能

    通过前面一篇集中式缓存的使用教程,我们已经了解了Redis的核心功能:作为K.V存储的高性能缓存. 接下来我们会分几篇来继续讲讲Redis的一些其他强大用法!如果你对此感兴趣,一定要关注收藏我哦! 发 ...

  5. Spring Boot 2.x基础教程:使用JTA实现分布式事务

    在一个Spring Boot项目中,连接多个数据源还是比较常见的.之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见: Spring Boot 2.x基础教程:JdbcTemplate的多数 ...

  6. Spring Boot 2.x基础教程:多文件的上传

    昨天,我们介绍了如何在Spring Boot中实现文件的上传(博客地址:https://blog.didispace.com/spring-boot-learning-21-4-3/).有读者问:那么 ...

  7. Spring Boot 2.x基础教程:使用集中式缓存Redis

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 之前我们介绍了两种进程内缓存的用法,包括Spring B ...

  8. Spring Boot 2.x基础教程:使用EhCache缓存集群

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 上一篇我们介绍了在Spring Boot中整合EhCac ...

  9. Spring Boot 2.x基础教程:MyBatis的多数据源配置

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 前两天,我们已经介绍了关于JdbcTemplate的多数 ...

最新文章

  1. 技术引路:机器学习仍大有可为,但方向在哪里?
  2. object标签与embad掉钱_使用object或embed标签来播放SWF文件
  3. solidworks经典实例网盘下载_Solidworks自学视频教程(附源文件)讲解详细到位,成就设计高手...
  4. Win2003的DHCP服务器无法提供服务怎么办?
  5. python3.7.3 离线安装paramiko_centos7 python3 安装paramiko模块
  6. 数组中的第k个最大元素—leetcode215
  7. 根据html元素的类型设置元素的值
  8. PHP获取访客ip、系统、浏览器等信息[转]
  9. 浏览器文件分段断点上传简单示例(python 篇)
  10. obs多推流地址_基于腾讯云的OBS 推流
  11. 阿铭Linux_网站维护学习笔记20190408
  12. 求曲线面积的原理(微积分入门)
  13. 路由器连接路由器设置教程
  14. Vue实现底部导航栏切换页面及图片
  15. 计算机毕业设计基于Android宠物领养救助系统app
  16. 西屋除湿机:快速干衣除了烘干机你还有更棒的选择
  17. T8000中央空调综合节能智能控制系统 力载波技术 无需布线 高效节能省钱省力 倡导全国应用
  18. spring boot es错误:availableProcessors is already set to [4], rejecting [4]
  19. 热点的ap频段哪个快,Ap频段2.4和5.0哪个快
  20. 电脑重启进安全模式按F几

热门文章

  1. JobTracker节点后台线程之RetireJobs
  2. docker 内存 cpu 限制 简介
  3. golang 字节切片 数组 字符串 互转
  4. linux c openssl rsa 加解密
  5. 探究C/C++可变参数
  6. VC6如何使用VS2005中的CImage类功能
  7. Android开发--BroadcastReceiver2
  8. OpenStack Neutron运行机制解析概要
  9. 问题集锦(41-42)
  10. Linux网络设备子系统