springboot RestTemplate 发送xml、接收xml、pojo中的属性转为属性

背景

调用第三方接口时,它们的系统比较老,只支持接收xml而不支持json,默认的springboot RestTemplate不支持发送xml,添加依赖就可以解决这个问题。

添加jackson-dataformat-xml依赖

FasterXML/jackson-dataformat-xml是一个xml编、解码库。

复制代码
<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-xml</artifactId>
  <version>version</version>
 </dependency>

这个版本号应该填什么呢?根据依赖关系spring-boot-starter-web---->spring-webmvc---->jackson-dataformat-xml,找到pom中的配置。

复制代码
<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
   <artifactId>jackson-dataformat-xml</artifactId>
   <version>2.9.8</version>
   <scope>compile</scope>
   <optional>true</optional>
 </dependency>

顺便说一下,因为它是optional的,所以要引用。

RestTemplate发送xml

复制代码
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.HttpEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;


HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
final URI uri = UriComponentsBuilder.fromUriString("url").build().toUri();
User user= new User();
HttpEntity<User> request = new HttpEntity<>(user, headers);
//响应是xml,也会自动转为POJO
final Result result= restTemplate.postForObject(uri,request , Result.class);

代码中的UserResult都是普通的POJO,发送时会自动的转换为xml,POJO中的属性会转换为xml中的节点 ,如果要转换为节点的属性 ,则在属性上添加@JacksonXmlProperty

复制代码
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

@Data
public class User{
    /**
     *指定为属性
     */
    @JacksonXmlProperty(isAttribute = true)
    private String name;
    /**
     * 默认的是节点
     */
    private BigDecimal money;
}

jackson-dataformat-xml常用的注解

jackson-dataformat-xml常用的几个注解有@JacksonXmlElementWrapper@JacksonXmlProperty@JacksonXmlRootElement@JacksonXmlText

  • @JacksonXmlElementWrapper
    • 用在集合元素上,可指定名称
  • @JacksonXmlProperty
    • 用在类的属性上,可以指定名称及属性转为节点or属性
  • @JacksonXmlRootElement
    • 指定根元素名称,用在类上
  • @JacksonXmlText
    • 转为xml后没有元素包裹,是个文本节点

更多信息可参考Jackson XML annotations,值得一提的是,对于集合属性,如果要同时指定容器容器内元素的名称,如下

复制代码
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
@JacksonXmlElementWrapper(localName = "users") //容器的名称
@JacksonXmlProperty(localName = "user")//容器元素的名称
private List<User> users;
相关推荐
挽安6213 小时前
若依微服务 Nacos 2.x 控制台配置列表为空?一个 tenant_id 字段引发的血案
后端
周杰伦fans3 小时前
ASP.NET Core Identity 从入门到实战:常见问题与解决方案
后端·asp.net
n8n4 小时前
Spring AI 三层架构详解:ChatModel → ChatClient → Controller,同步调用 vs 流式调用(SSE)
后端
小傅哥4 小时前
Java + DDD,1:1 复刻 Deepseek Harness 项目
前端·后端·ai编程
Lambert2814 小时前
AgentScope Java 从零(03):Agent 的记性默认全开,我在第 50 轮翻了车
后端·aigc
积硅步致千里4 小时前
Word 里的 .wmf 其实是 EMF:一次 metafile 转 PNG 排障
前端·后端
爱读源码的大都督4 小时前
DeepSeek面试官问:生产RAG系统回答不准确,该如何定位和优化?这样回答,能让面试官当场给你Offer!
java·后端·python
杨运交5 小时前
[069][公共模块]Spring Boot 全局异常处理与参数校验实战(下):校验异常精细化处理与 WebFlux 适配
java·spring boot·后端
行者-全栈开发5 小时前
Spring Boot + FFmpeg 视频批量处理实战:压缩、HLS切片与异步任务引擎
spring boot·ffmpeg·异步处理·视频压缩·hls切片·批量任务·redis队列
Andya_net5 小时前
Spring Boot | 条件注解完全指南:从 @Conditional 到 @ConditionalOnExpression 的原理、实践与避坑
spring boot·后端·python