使用RestTemplate获取XML对象列表时遇类型转换异常求助
问题分析与解决方案
核心问题
你遇到的UnknownContentTypeException本质是RestTemplate没有可用的HTTP消息转换器来处理text/xml类型的响应,同时实体类缺少XML映射注解,无法完成XML到Java对象的转换,代码里还有一处小笔误。
分步解决
1. 添加XML处理依赖
Spring默认RestTemplate需要额外依赖支持XML解析,推荐用Jackson XML处理器(兼容Java 8+,无需额外配置JAXB)。
- Maven项目在
pom.xml中添加:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
- Gradle项目添加:
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'
2. 修正实体类的XML映射注解
XML转Java对象需要明确映射规则,必须给实体类添加注解:
修正Object类
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElement; @JacksonXmlRootElement(localName = "Object") public class Object { @JacksonXmlElement(localName = "id") private String id; @JacksonXmlElement(localName = "name") private String name; public Object() {} public Object(String id, String name) { this.id = id; this.name = name; } // Getter和Setter保持不变 public String getId() {return id;} public void setId(String id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} }
修正ArrayOfObject类
注意:构造函数里的object = new ArrayList<>()是笔误,需改成objects = new ArrayList<>();同时添加XML注解指定根元素和列表元素名称:
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElement; import java.util.ArrayList; import java.util.List; @JacksonXmlRootElement(localName = "ArrayOfObject") public class ArrayOfObject { @JacksonXmlElementWrapper(useWrapping = false) // 禁用外层包装,匹配XML直接包含<Object>子元素的结构 @JacksonXmlElement(localName = "Object") private List<Object> objects; public ArrayOfObject() { this.objects = new ArrayList<>(); // 修正笔误 } // Getter和Setter保持不变 public List<Object> getObjects() {return objects;} public void setObjects(List<Object> objects) {this.objects = objects;} }
3. 配置RestTemplate的XML消息转换器
添加Jackson XML依赖后Spring会自动注册转换器,若需明确适配text/xml类型,可手动初始化RestTemplate:
import org.springframework.web.client.RestTemplate; import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import java.util.Arrays; @RestController @RequestMapping public class RestCall { @GetMapping("/objects") public List<Object> getObject(){ final String uri = "你的API地址"; RestTemplate rt = new RestTemplate(); // 添加支持text/xml的Jackson XML转换器 MappingJackson2XmlHttpMessageConverter xmlConverter = new MappingJackson2XmlHttpMessageConverter(); xmlConverter.setSupportedMediaTypes(Arrays.asList( org.springframework.http.MediaType.TEXT_XML, org.springframework.http.MediaType.APPLICATION_XML )); rt.getMessageConverters().add(xmlConverter); ArrayOfObject result = rt.getForObject(uri, ArrayOfObject.class); return result.getObjects(); } }
关键说明
@JacksonXmlElementWrapper(useWrapping = false):因为你的XML结构中ArrayOfObject直接包含多个<Object>子元素,不需要额外的<objects>包装层,所以禁用包装。- 若坚持使用JAXB(Java 8及以下默认支持),需给实体类添加
@XmlRootElement、@XmlElement注解,并确保jaxb-api依赖存在,但Jackson XML兼容性更好。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

