Gitee仓库
https://gitee.com/Lin_DH/system
介绍
可扩展标记语言 (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 {
@Override
public 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 {
@Resource
private 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】