介绍
Spring Boot 支持 XML 或者 JSON 格式的请求或者响应,但是返回的XML 数据是没有 XML declaration
例如<?xml version='1.0' encoding='UTF-8'?>
,本文主要解决这个问题。
加入依赖包
基于 Spring Boot 的项目,只要加入下面这个包,就可以支持 XML 的响应格式
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
添加测试接口
@RestController
public class TestController {
@GetMapping("/")
public User test() {
User user = new User();
user.setName("ldh");
return user;
}
@Data
public static class User{
private String name;
}
}
通过下面的请求访问
curl --location --request GET 'http://localhost:8080/'
响应的数据
{
"name": "ldh"
}
Spring Boot 的 @RestController
标注的接口默认返回的 json 格式,在请求的数据里加上 Accept:application/xml
的请求头,就可以返回 xml
的数据
修改请求数据并添加关键 header
curl --location --request GET 'http://localhost:8080/' --header 'Accept: application/xml'
响应数据
<User>
<name>ldh</name>
</User>
这时接口的数据返回了希望的 xml
数据,但是并没有 xml 的 decleration
的信息
查找到 Jackson
的 xml
配置是在org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration.MappingJackson2XmlHttpMessageConverterConfiguration
注入的,并且包含 @ConditionalOnMissingBean
注解,只要我们自定义一个这个的对象,并且修改一下配置就可以了,原配置如下。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(XmlMapper.class)
@ConditionalOnBean(Jackson2ObjectMapperBuilder.class)
protected static class MappingJackson2XmlHttpMessageConverterConfiguration {
@Bean
@ConditionalOnMissingBean
public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter(
Jackson2ObjectMapperBuilder builder) {
return new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build());
}
}
解决方案
需要注入MappingJackson2XmlHttpMessageConverter
覆盖默认的Bean
,并且设计优先级 @Order(1)
值越小 优先级越高
这段代码生成了一个XmlMapper
对象,并且加了一个配置 ToXmlGenerator.Feature.WRITE_XML_DECLARATION
@Configuration
@Order(1)
public class HttpMessageConverterConfig {
@Bean
public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter(
Jackson2ObjectMapperBuilder builder) {
XmlMapper xmlMapper = builder.createXmlMapper(true).build();
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION,true);
return new MappingJackson2XmlHttpMessageConverter(xmlMapper);
}
}
成功注入后重新请求接口
curl --location --request GET 'http://localhost:8080/' --header 'Accept: application/xml'
返回数据
<?xml version='1.0' encoding='UTF-8'?>
<User>
<name>ldh</name>
</User>
可以看到xml
数据中有<?xml version='1.0' encoding='UTF-8'?>
信息。
网友评论