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的自动序列化/反序列化:
- 定义
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; }
- 修改调用方法,使用实体类作为请求体
@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
相关产品推荐
相关产品推荐

