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
相关产品推荐
相关产品推荐

