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

Schreibe einen Kommentar