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

Spring RestTemplate POST XML报错:No HttpMessageConverter问题求助

解决RestTemplate调用XML接口时"No HttpMessageConverter for LinkedMultiValueMap"错误

错误原因

你用LinkedMultiValueMap作为POST请求体,同时设置了Content-Type: application/xml,但Spring的RestTemplate没有内置转换器能将MultiValueMap(为表单数据设计的结构)序列化为XML格式,因此抛出该异常。

解决方案

方法一:用实体类映射XML结构(推荐)

创建与目标XML结构对应的Java实体类,通过JAXB注解实现对象与XML的自动序列化/反序列化:

  1. 定义FolderRequest实体类
import lombok.Data;
import javax.xml.bind.annotation.XmlRootElement;
import java.time.ZonedDateTime;

@Data
@XmlRootElement(name = "folder")
public class FolderRequest {
    // 若接口允许created字段为空,可省略该属性
    private ZonedDateTime created;
    private String path;
}
  1. 修改调用方法,使用实体类作为请求体
@SneakyThrows
@GetMapping("/create")
public void post() {
    FolderRequest folderRequest = new FolderRequest();
    folderRequest.setPath("/okm:root/test4");
    // 若接口要求必填created,添加下面一行
    // folderRequest.setCreated(ZonedDateTime.now(ZoneOffset.UTC));

    HttpHeaders headers = new HttpHeaders();
    headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_VALUE);
    headers.setBasicAuth("dummy", "admin");
    headers.setContentType(MediaType.APPLICATION_XML);
    
    HttpEntity<FolderRequest> httpEntity = new HttpEntity<>(folderRequest, headers);
    ResponseEntity<Folder> response = restTemplate.exchange(
            "http://localhost:8080/OpenKM/services/rest/folder/create", 
            HttpMethod.POST, 
            httpEntity, 
            Folder.class);
    System.out.println(response);
}

方法二:手动构造XML字符串请求体

如果不想创建实体类,可直接拼接符合要求的XML字符串作为请求体:

@SneakyThrows
@GetMapping("/create")
public void post() {
    String xmlBody = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
                   + "<folder>"
                   + "  <path>/okm:root/test4</path>"
                   + "</folder>";

    HttpHeaders headers = new HttpHeaders();
    headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_VALUE);
    headers.setBasicAuth("dummy", "admin");
    headers.setContentType(MediaType.APPLICATION_XML);
    
    HttpEntity<String> httpEntity = new HttpEntity<>(xmlBody, headers);
    ResponseEntity<Folder> response = restTemplate.exchange(
            "http://localhost:8080/OpenKM/services/rest/folder/create", 
            HttpMethod.POST, 
            httpEntity, 
            Folder.class);
    System.out.println(response);
}

额外说明

  • 你的项目基于Java 8,JDK自带JAXB实现,无需额外添加依赖;若使用Java 9+,需在pom.xml中添加JAXB相关依赖。
  • 建议将MediaType.ALL.getType()改为MediaType.APPLICATION_XML_VALUE,精准设置Accept头更符合REST规范。

内容的提问来源于stack exchange,提问作者user1999453

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:35:22