求助:调用REST接口返回XML格式响应如何编写对应Java映射类
XML映射Java类实现方案
方案1:基于JAXB(Java官方标准实现)
依赖说明
JDK 8及以下版本JAXB为内置组件无需额外引入,JDK 9+需在pom.xml中添加如下依赖:
<!-- JAXB依赖 --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.1</version> <scope>runtime</scope> </dependency>
对应Java类代码
1. 根节点对应类
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "aname") public class Aname { private Bname bname; @XmlElement(name = "bname") public Bname getBname() { return bname; } public void setBname(Bname bname) { this.bname = bname; } }
2. 节点对应类
import javax.xml.bind.annotation.XmlElement; public class Bname { private C c; @XmlElement(name = "c") public C getC() { return c; } public void setC(C c) { this.c = c; } }
3. 节点对应类
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; public class C { private String id; private Cname cname; private Acc acc; @XmlAttribute(name = "id") public String getId() { return id; } public void setId(String id) { this.id = id; } @XmlElement(name = "cname") public Cname getCname() { return cname; } public void setCname(Cname cname) { this.cname = cname; } @XmlElement(name = "acc") public Acc getAcc() { return acc; } public void setAcc(Acc acc) { this.acc = acc; } }
4. 节点对应类
import javax.xml.bind.annotation.XmlAttribute; public class Cname { private String call; private String text; private String email; @XmlAttribute(name = "call") public String getCall() { return call; } public void setCall(String call) { this.call = call; } @XmlAttribute(name = "text") public String getText() { return text; } public void setText(String text) { this.text = text; } @XmlAttribute(name = "email") public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
5. 节点对应类
import javax.xml.bind.annotation.XmlElement; public class Acc { private Accinfo accinfo; @XmlElement(name = "accinfo") public Accinfo getAccinfo() { return accinfo; } public void setAccinfo(Accinfo accinfo) { this.accinfo = accinfo; } }
6. 节点对应类
import javax.xml.bind.annotation.XmlAttribute; public class Accinfo { private String name; private String addr; @XmlAttribute(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlAttribute(name = "addr") public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } }
反序列化示例代码
import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import java.io.StringReader; // xmlStr为REST接口返回的XML字符串 JAXBContext jaxbContext = JAXBContext.newInstance(Aname.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); Aname result = (Aname) unmarshaller.unmarshal(new StringReader(xmlStr));
方案2:基于Jackson XML(Spring生态推荐,适配REST接口场景)
依赖说明
Spring Boot项目只需在pom.xml中添加如下依赖:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
注解适配说明
只需将上述JAXB注解替换为Jackson XML对应注解即可:
- 根节点用
@JacksonXmlRootElement(localName = "节点名") - XML属性用
@JacksonXmlProperty(isAttribute = true, localName = "属性名") - 子节点用
@JacksonXmlProperty(localName = "节点名")
配置完成后,RestTemplate、WebClient均可直接支持XML响应的自动反序列化。
内容的提问来源于stack exchange,提问作者user7723264
相关产品推荐
相关产品推荐

