

Spring Boot中如何扩展XML请求和响应的支持
source link: http://blog.didispace.com/spring-boot-xml-httpmessageconverter/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在之前的所有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
目录:
以下专题教程也许您会有兴趣
Recommend
-
36
-
3
今天又要给大家介绍一个 Spring Boot 中的组件–HandlerMethodReturnValueHandler。 在前面的文章中(如何优雅的实现 Spring Boot 接口参数加密解密?),松哥已经和大家介绍过如何对...
-
8
案例学习 - 响应式网站的产品需求和设计流程详解 今次的译文中,我们继续响应式Web设计方面的话题。前面的几篇相关文章以概念诠释、方法说明为主,本篇则围绕一个实际网站案例展开...
-
11
《浏览器工作原理与实践》笔记之HTTP 请求和响应流程如果您发现本文排版有问题,可以先点...
-
6
编辑导语:UX设计师注重用户实际使用一款产品、网站或者APP时的相关数据,更多的是需要理解共性的设计模式,和用户的普遍心理期待;本文作者分享了关于UX设计师在工作中的设计方法,我们一起来学习一下。
-
11
在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理。那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式返回一个对象呢? 实现原理:消息转换器(Message Converter)在...
-
8
本文思路来自实际项目的重构总结,欢迎纠正和交流。如果对你有帮助,还请点赞👍收藏支持一下啦。最近重构一个老项目,发现其中处理请求的拦截器写得相当乱,于是我将整个项目的请求处理层重构了,目前已经在项目中正常运行。
-
3
Spring Boot 2.5.x能支持Java 17了 在 Spring Framework 中,AOP 代理是 JDK 动态代理或 CGLIB 代理。 ASM是 Java 字节码操作的框架。ASM 被 CGLIB 使用,而 CGLIB 又被
-
8
本文翻译自 Intercepting JavaScript Fetch API requests and responses 拦截器是可用于预处理或后处理 HTTP 请求的代码块,有助于全局错...
-
4
Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕。本篇给大家介绍如何在 Spring Boot 中使用 Webflux 。 为了方便大家理解,我们先来了解几个概念。 响应式编程 在计算机中,响应式编程或反应式...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK