Spring Boot中RestTemplate传递Multipart请求参数失败排查
解决RestTemplate调用Multipart接口时的MissingServletRequestPartException问题
你遇到的问题核心在于:直接传递byte[]无法让服务端正确解析为MultipartFile。
问题原因
服务端Controller用@RequestParam("image") MultipartFile接收文件,但你在RestTemplate中直接把文件的byte[]放入请求体。虽然请求里确实存在image参数名,但Spring的Multipart解析器需要文件的元数据(比如文件名、Content-Type)才能将二进制数据解析为MultipartFile对象,单纯的byte[]没有这些元信息,导致解析失败。
解决方案
用ByteArrayResource包装文件字节,提供必要的元数据:
修改调用方代码如下:
@Override public UploadImageResponse uploadFile(UploadImageRequest request) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); headers.add(HttpHeaders.AUTHORIZATION, Constants.BEARER + " " + TokenContext.get()); MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); // 用ByteArrayResource包装文件字节,重写getFilename提供文件名 ByteArrayResource imageResource = new ByteArrayResource(request.getFile().getBytes()) { @Override public String getFilename() { return request.getFile().getOriginalFilename(); } }; body.add("image", imageResource); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers); ResponseEntity<UploadImageResponse> response = restTemplate .postForEntity(String.format(IMAGE_UPLOAD_URL, MEDIA_SERVICE_HOST, request.getPostId()), requestEntity, UploadImageResponse.class); return response.getBody(); }
额外检查项
如果修改后仍有问题,确认RestTemplate是否包含FormHttpMessageConverter:
默认RestTemplate会自动配置该转换器,但如果是自定义Bean,需确保它被加入转换器列表:
@Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new FormHttpMessageConverter()); return restTemplate; }
原理说明
ByteArrayResource实现了InputStreamSource接口,Spring的Multipart解析器可通过它读取文件输入流,重写的getFilename()方法提供了文件名,满足MultipartFile解析所需的元数据条件,服务端就能正确将请求参数解析为MultipartFile对象。
内容的提问来源于stack exchange,提问作者Akheel Pasha
相关产品推荐
相关产品推荐

