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

RestTemplate.postForEntity发送含Multipart文件与JSON请求时抛异常

问题原因分析

你代码的核心问题在于错误地将HttpEntity作为Multipart表单的单项内容,Spring的MultipartHttpMessageConverter无法识别嵌套的HttpEntity类型,导致抛出找不到合适转换器的异常。此外还有几个冗余操作:

  • 不需要给每个表单项单独设置Bearer令牌,只需在整体请求头中配置一次即可
  • 直接传入File对象可能无法被正确序列化,应该用FileSystemResource包装文件
修正后的实现代码

以下是正确的实现方式,同时简化了冗余的配置:

try {
    // 1. 配置全局请求头:设置Multipart类型和Bearer认证
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    headers.setBearerAuth("auth_token");

    // 2. 构建Multipart表单数据
    MultiValueMap<String, Object> requestBody = new LinkedMultiValueMap<>();
    // 文件部分:用FileSystemResource包装文件,自动处理文件类型
    requestBody.add("file", new FileSystemResource(new File(path)));
    // JSON元数据部分:直接传入JSON字符串
    String jsonString = new ObjectMapper().writeValueAsString(jsonObject);
    requestBody.add("metadatak", jsonString);

    // 3. 创建请求实体并发送请求
    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
    ResponseEntity<String> responseResult = template.postForEntity(url, requestEntity, String.class);

    return ResponseEntity.ok(responseResult);
} catch (RestClientException rex) {
    logger.error("RestClientException occurred: {}", rex.getMessage());
    rex.printStackTrace();
    return ResponseEntity.badRequest().build();
} catch (Exception ex) {
    logger.error("Exception occured : " + ex);
    ex.printStackTrace();
    return ResponseEntity.status(400).build();
}
额外注意事项

如果你的RestTemplate是手动创建的(而非Spring Boot自动注入的),需要确保添加了MultipartHttpMessageConverter,否则仍会出现转换器缺失的问题:

RestTemplate template = new RestTemplate();
template.getMessageConverters().add(new MultipartHttpMessageConverter());
替代实现方案(直接传入JSON对象)

如果不想手动序列化JSON字符串,可以直接将jsonObject放入表单,前提是RestTemplate配置了MappingJackson2HttpMessageConverter(Spring Boot自动配置已包含):

// 替换JSON字符串的部分
requestBody.add("metadatak", jsonObject);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:37:24