背景
调用第三方接口时,它们的系统比较老,只支持接收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);
代码中的User
、Result
都是普通的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;