2015-02-24 45 views
1

我想使用restTemplate發送包含文件和另一個自定義對象的POST請求。我試過下面的代碼,但沒有得到它的工作,因爲它缺少一個HtttpMessageConverterjava.io.File如何將包含POST請求中的文件的MultiValueMap發送到Spring rest Web服務?

是MultiValueMap正確的選擇發送兩個對象在一個請求?如果沒有,有什麼建議嗎?如果是,那麼我如何解決消息轉換器問題?

客戶端(從herehere通過):

RestTemplate rest = new RestTemplate(); 
    HttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter(); 
    HttpMessageConverter stringHttpMessageConverternew = new StringHttpMessageConverter(); 
    List<HttpMessageConverter<?>> conv = new ArrayList<HttpMessageConverter<?>>(); 
    conv.add(formHttpMessageConverter); 
    conv.add(stringHttpMessageConverternew); 

    rest.setMessageConverters(conv); 
    MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>(); 
    File f = new File("testFile.txt"); 
    map.add("file", f); 
    NewObject a = new NewObject("123", "xxx", "xxx", 
      "blahblah", "5432"); 
    map.add("newObject", a); 
    String result = rest.postForObject("http://localhost:8080/test/upload", map, String.class); 
    System.out.println(result); 

控制器:

@RequestMapping(value="/upload", method=RequestMethod.POST) 
public @ResponseBody String uploadArtefact(@RequestBody MultiValueMap<String, Object> o) 
{ 
    logger.info("tesssting: " + o); 
    File x = (File) o.get("file").get(0); 
    logger.info("File name " + x.getName()); 
    NewObject a = (NewObject) o.get("newObject").get(0); 
    logger.info("New Object: " + a); 
    return "finished"; 


} 

這是我在客戶端得到的錯誤:

Exception in thread "main" org.springframework.http.converter.HttpMessageNotWritableException: Could not write request: no suitable HttpMessageConverter found for request type [java.io.File] 
at org.springframework.http.converter.FormHttpMessageConverter.writePart(FormHttpMessageConverter.java:317) 
at org.springframework.http.converter.FormHttpMessageConverter.writeParts(FormHttpMessageConverter.java:275) 
at org.springframework.http.converter.FormHttpMessageConverter.writeMultipart(FormHttpMessageConverter.java:264) 
at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:204) 
at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:72) 
at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:751) 
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:540) 
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:503) 
at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:331) 
at uk.ac.ncl.rest.Test.main(Test.java:47) 

並且這兩行記錄在服務器端:

2015-02-24 16:44:14.772 WARN 38776 --- [nio-8080-exec-1] .c.j.MappingJackson2HttpMessageConverter : Failed to evaluate deserialization for type [map type; class org.springframework.util.MultiValueMap, [simple type, class java.lang.String] -> [collection type; class java.util.List, contains [simple type, class java.lang.Object]]]: com.fasterxml.jackson.databind.JsonMappingException: Can not find a deserializer for non-concrete Map type [map type; class org.springframework.util.MultiValueMap, [simple type, class java.lang.String] -> [collection type; class java.util.List, contains [simple type, class java.lang.Object]]] 
2015-02-24 16:44:14.772 WARN 38776 --- [nio-8080-exec-1] .c.j.MappingJackson2HttpMessageConverter : Failed to evaluate deserialization for type [map type; class org.springframework.util.MultiValueMap, [simple type, class java.lang.Object] -> [collection type; class java.util.List, contains [simple type, class java.lang.Object]]]: com.fasterxml.jackson.databind.JsonMappingException: Can not find a deserializer for non-concrete Map type [map type; class org.springframework.util.MultiValueMap, [simple type, class java.lang.Object] -> [collection type; class java.util.List, contains [simple type, class java.lang.Object]]] 

回答

1

我花這麼多時間在這個錯誤上!

FormHttpMessageConverter具有用於部件3個轉換器:

  1. ByteArrayHttpMessageConverter - 寫入字節[]類
  2. StringHttpMessageConverter - String.class
  3. ResourceHttpMessageConverter - org.springframework.core.io.Resource.class - 這裏有竅門

不應該把文件本身放在文件中,你應該把它作爲資源:

File file = new File("some_path"); 
Resource resource = new FileSystemResource(file); 
map.add("file", resource); 

的FileSystemResource是從包org.springframework.core.io

相關問題