介绍
可扩展标记语言 (Extensible Markup Language, XML) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 可扩展性良好,内容与形式分离,遵循严格的语法要求,保值性良好等优点。
日常开发中,经常会用到Json格式和Xml格式的请求和响应处理,那xml格式的应该如何处理呢?
实现原理
在 SpringBoot 中处理Http请求的视线是采用 Spring MVC,而在Spring MVC 中有一个消息转换器的概念,它主要负责处理各种不同格式的请求数据进行处理,并转换成对象,以提供更好的编程体验。
在 Spring MVC 中定义了 HttpMessageConverter 接口,抽象了消息转换器对类型的判断、对读写的判断与操作。
Http 请求的 Content-Type 有各种不同格式定义,如果要支持 xml 格式的消息转换,就要使用对应的转换器。Spring MVC 中默认采用 Jackson 实现的转换器 MappingJackson2XmlHttpMessageConverter。
代码实现
第一步:引入 xml 消息转换器
在 Spring Boot 应用中,只需要引入 jackson-dataformat-xml 依赖,应用会自动引入 MappingJackson2XmlHttpMessageConverter 的实现。
pom.xml
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>
</dependency>
在传统 Spring 应用中,通过配置加入对 xml 格式数据的消息转换实现
CustomMessageConverterConfig.java
@Configuration
public class CustomMessageConverterConfig extends WebMvcConfigurerAdapter {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();builder.indentOutput(true);converters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));}
}
第二步:定义对象与 xml 的关系
User.java
package com.lm.system.common;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.util.Date;/*** @Author: DuHaoLin* @Date: 2024/7/26*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@JacksonXmlRootElement(localName = "User")
public class User {@TableId(value = "id", type = IdType.INPUT)@JacksonXmlProperty(localName = "id")private Integer id; //自增长@JacksonXmlProperty(localName = "name")private String name;@JacksonXmlProperty(localName = "age")private Integer age;@JacksonXmlProperty(localName = "gender")private String gender; //性别@JacksonXmlProperty(localName = "deleted")private Integer deleted; //是否已经删除:0否,1是@JacksonXmlProperty(localName = "createTime")private Date createTime;@JacksonXmlProperty(localName = "updateTime")private Date updateTime;}
第三步:编写 controller 类
UserController.java
package com.lm.system.controller;import com.lm.system.common.User;import com.lm.system.service.UserService;import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.util.List;/*** @Author: DuHaoLin* @Date: 2024/7/26*/
@RestController
@Api(tags = "用户接口")
@RequestMapping("user")
public class UserController {@Resourceprivate UserService userService;/*** 以xml的格式查询出用户数据*/@GetMapping(value = "xmlUsers", produces = MediaType.APPLICATION_XML_VALUE)public List<User> xmlUsers() {return userService.queryAllUser();}/*** 传入xml的格式id,查询出xml格式的用户数据*/@PostMapping(value = "queryXmlUserById", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)public User queryXmlUserById(@RequestBody User user) {return userService.queryUserById(user.getId());}}
效果图
1.查询数据库中所有用户数据,以xml格式呈现。
2.用Post方式传xml格式的id,查询对应的xml格式的用户数据。
项目结构图
参考资料
Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应【https://www.didispace.com/spring-boot-2/3-8-xml.html】