Meine Benutzer können ein Foto von einem Essen und einem Post von dem, was das Essen ist, auf meinem Server posten.Spring RestTemplate: posten Sie gleichzeitig ein Bild und ein Objekt
Zum Beispiel, sagen wir, jemand sieht etwas Leckeres, macht ein Bild davon und schreibt dann "Tasty!" unter dem Bild. Das Foto wird an den Server gesendet und die Nachricht "Tasty!" einschließlich des Benutzernamens, des Datums, des Ortes usw. wird in einem Objekt, das "Post" genannt wird, unter Verwendung eines API-Anrufs an meinen Server gesendet.
ich den folgenden Code auf meinem Android-Seite geschrieben haben:
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();
Dies ist der Code auf der Federseite ist:
@RequestMapping(value = "/uploadpostpic", method = RequestMethod.POST)
public Post uploadPostWithPic(@RequestParam("image") MultipartFile srcFile,
@RequestParam("post") Post post) {
return serviceGateway.uploadPostWithPic(srcFile, post);
}
Ich erhalte eine Fehlermeldung:
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]
Ich vermute, es ist damit zu tun, dass der Content-Typ auf MULTIPART_FORM_DATA gesetzt ist, aber ich muss es so einstellen, wie ich es übertragen muss er das Bild bis zum Server.
Ist es sogar möglich, eine mehrteilige Datei und ein weiteres Objekt gleichzeitig mit restTemplate zu übertragen?
EDIT:
Resttemplate form/multipart: image + JSON in POST
Sending Multipart File as POST parameters with RestTemplate requests
und versuchte, nach ihrer Führung diesen Code:
ich an diesen Stellen ausgesehen haben
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);
Auf der anderen Seite, der Beitrag = null und ich bin mir nicht sicher, warum es null ist.
Das ist alles, was ich bin versucht, auf der Server-Seite zu tun:
public Post uploadPostPic(MultipartFile srcFile, Post post) {
Post savedPost = repo.save(post);
}
ich es in meinen Repository bin Speicher und der Fehler ist:
java.lang.IllegalArgumentException: Entity must not be null!
Ich möchte dies nicht tun, wenn Spring diese Funktion automatisch eingebaut hat/ – Simon
Am Ende habe ich Ihre Methode verwendet, um mein Problem zu lösen. – Simon