You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:30:39