在post请求中,使用@RequestPart注解同时接收文件和json类型的数据,报错 “Content type 'application/octet-stream' not supported”:
"message": "Content type 'application/octet-stream' not supported"
本文介绍如何正确使用@RequestPart注解同时接收 文件 和 json 类型的数据。
1、问题描述
①Controller:
@PostMapping(value = "/importV2")
public Response<String> uploadAndImportRec(@RequestPart @NotNull MultipartFile multipartFile,
@RequestPart RecImportRequest recImportRequest){
//上传文件
String temp = rexManagementService.uploadRecFile(multipartFile);
recImportRequest.setRecFileId(temp);
//上传其他信息
rexManagementService.createOfflineRec(recImportRequest);
return new Response<>();
}
②Postman测试:
Header信息
Body信息
③报错
报错信息
2、报错原因
参考这篇文章,发现报错原因是,未将原始json格式的数据转换为http能够识别的字符串流。
3、解决办法
自定义转换器,实现HttpMessageConverter,即json数据到http字符串流的转换。比较简单的做法是直接继承AbstractJackson2HttpMessageConverter。
代码如下:
@Component
public class MultipartJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter {
/**
* Converter for support http request with header Content-Type: multipart/form-data
*/
public MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) {
super(objectMapper, MediaType.APPLICATION_OCTET_STREAM);
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
return false;
}
@Override
public boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {
return false;
}
@Override
protected boolean canWrite(MediaType mediaType) {
return false;
}
}