在post請求中,使用@RequestPart注解同時接收文件和json類型的數(shù)據(jù)枯途,報錯 “Content type 'application/octet-stream' not supported”:
"message": "Content type 'application/octet-stream' not supported"
本文介紹如何正確使用@RequestPart注解同時接收 文件 和 json 類型的數(shù)據(jù)。
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測試:
③報錯
2泪电、報錯原因
參考這篇文章,發(fā)現(xiàn)報錯原因是阻逮,未將原始json格式的數(shù)據(jù)轉換為http能夠識別的字符串流。
3秩彤、解決辦法
自定義轉換器夺鲜,實現(xiàn)HttpMessageConverter,即json數(shù)據(jù)到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;
}
}