私のユーザーは、食べ物の写真と食べ物の投稿を自分のサーバーに投稿できます。春のRestTemplate:画像とオブジェクトの両方を同時に投稿する
たとえば、誰かが美味しいものを見て、その写真をスナップして、「おいしい!」と書いてみましょう。写真の下に。写真はサーバーに送信され、「おいしい!」というメッセージが送信されます。ユーザー名、日付、場所などを含むメッセージが、1つのAPIコールを使用して「Post」というオブジェクトでサーバーに送信されます。
私は私のアンドロイド側に次のコードを書かれている:
final String url = Constants.POST_PICS;
RestTemplate restTemplate = RestClientConfig.getRestTemplate(context, true);
//adding StringHttpMessageConverter, formHttpMessageConverter and MappingJackson2HttpMessageConverter to restTemplate
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
restTemplate.getMessageConverters().add(formHttpMessageConverter);
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
//putting both objects into a map
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("image", new FileSystemResource(file));
map.add("post", post);
HttpHeaders imageHeaders = new HttpHeaders();
//setting content type to multipart as the image is a multipart file
imageHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> imageEntity = new HttpEntity<MultiValueMap<String, Object>>(map, imageHeaders);
ResponseEntity<Post> response = restTemplate.exchange(url, HttpMethod.POST, imageEntity, Post.class);
return response.getBody();
これは春の側のコードです:
@RequestMapping(value = "/uploadpostpic", method = RequestMethod.POST)
public Post uploadPostWithPic(@RequestParam("image") MultipartFile srcFile,
@RequestParam("post") Post post) {
return serviceGateway.uploadPostWithPic(srcFile, post);
}
私はエラーを取得しています:
An exception occurred during request network execution :Could not write request: no suitable HttpMessageConverter found for request type [Model.Post]
org.springframework.http.converter.HttpMessageNotWritableException: Could not write request: no suitable HttpMessageConverter found for request type [Model.Post]
コンテンツタイプがMULTIPART_FORM_DATAに設定されていると思われますが、トランスフォームする必要があるため、これを設定する必要があります画像をサーバーに転送します。
restTemplateを使用してマルチパートファイルと別のオブジェクトを同時にアップストリームで転送することは可能ですか?
EDIT:
私はこれらの記事を見てきました:
Resttemplate form/multipart: image + JSON in POST
Sending Multipart File as POST parameters with RestTemplate requests
そして、彼らのガイダンスに従って、このコードを試してみました:他に
final String url = Constants.POST_PIC;
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter());
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new ResourceHttpMessageConverter());
FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
formHttpMessageConverter.addPartConverter(new MappingJackson2HttpMessageConverter());
formHttpMessageConverter.addPartConverter(new ResourceHttpMessageConverter()); // This is hope driven programming
formHttpMessageConverter.addPartConverter(new ByteArrayHttpMessageConverter());
restTemplate.getMessageConverters().add(formHttpMessageConverter);
MultiValueMap<String, Object> multipartRequest = new LinkedMultiValueMap<>();
byte[] bFile = new byte[(int) imageFile.length()];
FileInputStream fileInputStream;
//convert file into array of bytes
fileInputStream = new FileInputStream(imageFile);
fileInputStream.read(bFile);
fileInputStream.close();
ByteArrayResource bytes = new ByteArrayResource(bFile) {
@Override
public String getFilename() {
return "file.jpg";
}
};
//post portion of the multipartRequest
HttpHeaders xHeader = new HttpHeaders();
xHeader.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Post> xPart = new HttpEntity<>(post, xHeader);
multipartRequest.add("post", xPart);
//picture portion of the multipartRequest
HttpHeaders pictureHeader = new HttpHeaders();
pictureHeader.setContentType(MediaType.IMAGE_JPEG);
HttpEntity<ByteArrayResource> picturePart = new HttpEntity<>(bytes, pictureHeader);
multipartRequest.add("srcFile", picturePart);
//adding both the post and picture portion to one httpentity for transmitting to server
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity(multipartRequest, header);
return restTemplate.postForObject(url, requestEntity, Post.class);
を側、ポスト= nullと私はなぜそれがnullであるか分からない。
これは、私は、サーバー側でやろうとしているすべてである:
public Post uploadPostPic(MultipartFile srcFile, Post post) {
Post savedPost = repo.save(post);
}
私は私のリポジトリとエラーにそれを保存しています:私は見ていない
java.lang.IllegalArgumentException: Entity must not be null!
Springにこの機能が自動的に組み込まれている場合、私はこれをしたくない/ – Simon
結局のところ、あなたの方法を使って私の問題を解決しました。 – Simon