Resttemplate form/mehrteilig: Bild + JSON in der POST
Ich versuche zu nennen, einen rest-ws (mit resttemplate), nimmt ein Bild und einige JSON. Aber ich bin anscheinend nicht in der Lage sein, um es läuft.
Den entsprechenden code wie folgt:
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);
Wobei x eine POJO mit allen erforderlichen JSON Anmerkungen (ich erhalte von einem anderen web-service, der Teil funktioniert ok).
Dieser Sache, aber sagt mir: HttpMessageNotWritableException: Konnte nicht schreiben, Anfrage: Nein geeignet HttpMessageConverter gefunden für x.
Wenn ich ByteArrayResource zu byte [], dann bekomme ich einen 400 Bad Request.
Wenn ich den content-type für JSON ist, dann ByteArrayResource nicht in das JSON serialisiert werden:
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"])
Ich habe folgenden Wandler konfiguriert:
StringHttpMessageConverter,
MappingJackson2HttpMessageConverter
FormHttpMessageConverter
Irgendwelche Ideen, bitte?
Vielen Dank im Voraus.
UPDATE
Also das ist, was ich derzeit habe nach der Anleitung:
Melde ich die Konverter wie diesem:
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);
Dann in der ws-Aufruf habe ich:
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);
InformationsquelleAutor TamasGyorfi | 2015-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie verwenden möchten
ByteArrayResource
, registrieren Sie einfach eineResourceHttpMessageConverter
.Wenn Sie möchten, verwenden Sie eine
byte[]
, registrieren Sie einfach eineByteArrayHttpMessageConverter
.Den content-type des Bildes Teil sollte ein Bild geben, wie
image/png
, nichtapplication/json
.Können Sie jedes einzelne Teil der Daten geben Sie mit
Erstellen Sie Ihre
RestTemplate
indem Sie Ihre Sammlung vonHttpMessageConverter
sund Ihre äußersten
HttpEntity
sollte einen multipart-content-typesetContentType
.Das beste was ich tun konnte, war mit einemObjectMapper
um eine string-Darstellung meiner JSON-Objekt und lassen Sie den Inhaltstyp alsMULTIPART_FORM_DATA
(ist das ok für das Bild, nicht so gut für die JSON, welche endet als nur text)Siehe update.
🙁 immer noch der gleiche. Ich habe mich registriert, den Konverter (halten wollte mit
ByteArrayResource
), Hinzugefügt, die überschriften für die einzelnen Artikel. Wenn die top-level-header gesetzt ist mehrteilig, es kann nicht serialisieren mein POJO, wenn es JSON, es kann nicht serialisiert dieByteArrayResource
. Vielleicht bin ich einfach zu müde und schon etwas verpasst.Bitte Bearbeiten Sie die Frage, und fügen Sie genau, was Sie gerade tun, wie Sie erstellen die
RestTemplate
- und register-Wandler.Getan. Ich habe meinen aktuellen code
InformationsquelleAutor Sotirios Delimanolis