Resttemplate form / multipart:POST中的图像+ JSON

我正在尝试调用restws(使用resttemplate),它接受一个图像和一些JSON。 但是,我似乎无法让它运行。

相关代码如下:

HttpHeaders header = new HttpHeaders(); header.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap map = new LinkedMultiValueMap(); ByteArrayResource bytes = new ByteArrayResource(pictureData) { @Override public String getFilename() { return pictureName; } }; map.add("x", x); map.add("file", bytes); HttpEntity<MultiValueMap> requestEntity = new HttpEntity(map, header); String response = restTemplate.postForObject(UPLOAD_URL, requestEntity, String.class); 

其中x是一些带有所有必需JSON注释的POJO(我从另一个Web服务接收它,那部分工作正常)。

但是,这件事告诉我:HttpMessageNotWritableException:无法写入请求:没有为x找到合适的HttpMessageConverter。

如果我将ByteArrayResource更改为byte [],那么我会收到400 Bad Request。 如果我将内容类型更改为JSON,则无法将ByteArrayResource序列化为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]->abc["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]->abc["inputStream"]) 

我配置了以下转换器:

 StringHttpMessageConverter, MappingJackson2HttpMessageConverter FormHttpMessageConverter 

请问有什么想法吗? 提前致谢。

UPDATE

所以这是我目前在说明之后所拥有的:我注册这样的转换器:

  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); 

然后在ws电话中我有:

  HttpHeaders header = new HttpHeaders(); header.setContentType(MediaType.APPLICATION_JSON); //Also tried with multipart... MultiValueMap multipartRequest = new LinkedMultiValueMap(); ByteArrayResource bytes = new ByteArrayResource(pictureData) { @Override public String getFilename() { return pictureName; } }; HttpHeaders xHeader = new HttpHeaders(); xHeader.setContentType(MediaType.APPLICATION_JSON); HttpEntity xPart = new HttpEntity(x, xHeader); multipartRequest.add("x", xPart); HttpHeaders pictureHeader = new HttpHeaders(); pictureHeader.setContentType(MediaType.IMAGE_PNG); HttpEntity picturePart = new HttpEntity(bytes, pictureHeader); multipartRequest.add("file", picturePart); HttpEntity<MultiValueMap> requestEntity = new HttpEntity(multipartRequest, header); return restTemplate.postForObject(UPLOAD_URL, requestEntity, String.class); 

如果要使用ByteArrayResource ,只需注册ResourceHttpMessageConverter

如果要使用byte[] ,只需注册ByteArrayHttpMessageConverter

图像部分的内容类型应该是图像类型,如image/png ,而不是application/json

您可以使用设置每个单独部件的数据类型

 HttpHeaders partHeaders = new HttpHeaders(); partHeaders.setContentType(MediaType.IMAGE_PNG); HttpEntity bytesPart = new HttpEntity(bytes, partHeaders); map.add("file", bytesPart); 

通过提供您的HttpMessageConverter集合来创建您的HttpMessageConverter

 HttpMessageConverter jackson = new MappingJackson2HttpMessageConverter(); HttpMessageConverter resource = new ResourceHttpMessageConverter(); FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter(); formHttpMessageConverter.addPartConverter(jackson); formHttpMessageConverter.addPartConverter(resource); // This is hope driven programming RestTemplate restTemplate = new RestTemplate(Arrays.asList(jackson, resource, formHttpMessageConverter)); 

并且您最外层的HttpEntity应该具有多部分内容类型

 header.setContentType(MediaType.MULTIPART_FORM_DATA);