Resttemplate forme/multipart: image + JSON dans le POST
Je suis en train d'appeler un repos ws (à l'aide de resttemplate), qui accepte une image et du JSON. Cependant, je ne semble pas être en mesure de l'obtenir en cours d'exécution.
Le code est comme suit:
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
ByteArrayResource bytes = new ByteArrayResource(pictureData) {
@Override
public String getFilename() {
return pictureName;
}
};
map.add("x", x);
map.add("file", bytes);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity(map, header);
String response = restTemplate.postForObject(UPLOAD_URL, requestEntity, String.class);
Où x est un POJO avec JSON annotations (je le recevoir d'un autre service web, la partie ok).
Cette chose, cependant, me dit: HttpMessageNotWritableException: ne Peut pas écrire sur demande: non adapté HttpMessageConverter trouvé pour x.
Si je change ByteArrayResource de byte[] puis-je obtenir un 400 Bad Request.
Si je change le type de contenu JSON, puis ByteArrayResource ne peut pas être sérialisé en JSON:
Caused by: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: org.springframework.util.LinkedMultiValueMap["file"]->java.util.LinkedList[0]->a.b.c.["inputStream"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: org.springframework.util.LinkedMultiValueMap["file"]->java.util.LinkedList[0]->a.b.c.["inputStream"])
J'ai les convertisseurs suivants sont configurés:
StringHttpMessageConverter,
MappingJackson2HttpMessageConverter
FormHttpMessageConverter
Toutes les idées, s'il vous plaît?
Merci à l'avance.
Mise à JOUR
C'est donc ce que j'ai actuellement d'après les instructions:
- Je enregistrer les convertisseurs comme ceci:
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
formHttpMessageConverter.addPartConverter(new MappingJackson2HttpMessageConverter());
formHttpMessageConverter.addPartConverter(new ResourceHttpMessageConverter()); //This is hope driven programming
restTemplate.getMessageConverters().add(new ResourceHttpMessageConverter());
restTemplate.getMessageConverters().add(formHttpMessageConverter);
Puis dans le ws appel que j'ai:
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON); //Also tried with multipart...
MultiValueMap<String, Object> multipartRequest = new LinkedMultiValueMap<>();
ByteArrayResource bytes = new ByteArrayResource(pictureData) {
@Override
public String getFilename() {
return pictureName;
}
};
HttpHeaders xHeader = new HttpHeaders();
xHeader.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<X> xPart = new HttpEntity<>(x, xHeader);
multipartRequest.add("x", xPart);
HttpHeaders pictureHeader = new HttpHeaders();
pictureHeader.setContentType(MediaType.IMAGE_PNG);
HttpEntity<ByteArrayResource> picturePart = new HttpEntity<>(bytes, pictureHeader);
multipartRequest.add("file", picturePart);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity(multipartRequest, header);
return restTemplate.postForObject(UPLOAD_URL, requestEntity, String.class);
OriginalL'auteur TamasGyorfi | 2015-03-21
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez utiliser
ByteArrayResource
, il suffit de s'inscrire uneResourceHttpMessageConverter
.Si vous souhaitez utiliser un
byte[]
, il suffit de s'inscrire uneByteArrayHttpMessageConverter
.Le type de contenu de la partie de l'image doit être d'un type d'image, comme
image/png
, pasapplication/json
.Vous pouvez définir chaque partie du type de données avec
Créer votre
RestTemplate
en fournissant votre collection deHttpMessageConverter
set votre ultrapériphériques
HttpEntity
doit avoir un type de contenu de type multipartsetContentType
.Le meilleur que je pouvais venir a l'aide d'unObjectMapper
pour obtenir une représentation de chaîne de mon objet JSON et de laisser le type de contenu queMULTIPART_FORM_DATA
(c'est ok pour l'image, pas très bon pour le JSON, qui se termine en texte brut)Voir mise à jour.
🙁 c'est toujours la même. Je me suis inscrit le convertisseur (voulais rester avec
ByteArrayResource
), ajoute les en-têtes de chaque partie. Si le haut niveau de l'en-tête est défini de plusieurs parties, il est impossible de sérialiser mon POJO, si c'est du JSON, il est impossible de sérialiser lesByteArrayResource
. Peut-être que je suis trop fatigué et déjà raté quelque chose.Merci d'éditer votre question et ajouter exactement ce que vous faites actuellement, y compris la façon de créer le
RestTemplate
et enregistrer les convertisseurs.Fait. J'ai ajouté mon code actuel
OriginalL'auteur Sotirios Delimanolis