2012-12-17 67 views
3

我想編寫一個REST服務,它使用zipFile和一些json數據進行響應,一切都在一個多部分/混合請求中。Spring REST - RestTemplate是否可以消耗多部分/混合?

服務器部分工作正常,我用firefox的REST客戶端測試它。我的服務器發送這樣

--k-dXaXvCFusLVXUsg-ryiHMmkdttadgcBqi4XH 

Content-Disposition: form-data; name="form" 
Content-type: application/json 

{"projectName":"test","signal":"true"} 

--k-dXaXvCFusLVXUsg-ryiHMmkdttadgcBqi4XH 
Content-Disposition: form-data; name="file2"; filename="file2.txt" 
Content-type: application/octet-stream 
Content-Length: 10 

hallo=Welt 

我知道RestTemplate可以用MultiValueMap的幫助下發出的multipart開箱即用的多。

現在我試圖消耗多部分/混合反應並返回一個MultiValueMap

@Component 
public class RestCommand 
extends AbstractLoginRestCommand<Form, MultiValueMap<String, Object>> 
{ 
    @Override 
    protected MultiValueMap<String, Object> executeInternal (Form form) 
    { 
     RestTemplate restTemplate = getRestTemplate(); 
     MyMultiValueMap map = restTemplate.postForObject(getUrl(), form, MyMultiValueMap.class); 
     return new LinkedMultiValueMap<String, Object>(map); 
    } 
} 

class MyMultiValueMap extends LinkedMultiValueMap<String, Object> 
{} 

MyMultiValueMap存在,以防止類型擦除(泛型)。

這給出

org.springframework.web.client.RestClientException:無法提取 響應:沒有合適HttpMessageConverter找到的響應類型 [類org.jlot.client.remote.MyMultiValueMap]和內容在 org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:107) 在 org.springframework.web鍵入 [字符集= UTF-8的multipart/form-data的;邊界= RJH-fkdsI9OIyPpYwdFY7lsUIewhRSX8kE19I] .client.RestTemplate.doExecute(RestT emplate.java:492)

FormHttpMessageConverter的Javadoc表示它可以編寫但不能讀取multipart/form-data。

這是爲什麼?

有沒有辦法使用RestTemplate即時讀取multipart/form-data或是否需要編寫HttpMessageConverter?

+0

你得回答你的問題?下面的回答對我無效 – Rajesh

回答

1

我有同樣的問題,我想我達到了你想要的。 您只需要覆蓋格式轉換器的canRead方法。用你的例子下面的東西應該工作。

FormHttpMessageConverter formConverter = new FormHttpMessageConverter() { 
    @Override 
    public boolean canRead(Class<?> clazz, MediaType mediaType) { 
     if (clazz == MyMultiValueMap.class) { 
      return true; 
     } 
     return super.canRead(clazz, mediaType); 
    } 
}; 

並將此轉換器添加到您的休息模板。

+0

我已經使用了這種方法,但是MyMultiValueMap沒有正確地分離application/octet-stream和application/json嗎?我們怎樣才能正確地分開這兩個?按照以下鏈接(http://mfjassociates.blogspot.in/2012/02/handling-multipart-form-data-in-spring.html)multipart/mixed是否不被正確支持?這不可能嗎? – Rajesh

0

我用眼前這個解決方案:

@ResponseBody 
@PostMapping(value = JlotApiUrls.PUSH, produces = "application/json") 
public List<PushResultDTO> push ( 
     @PathVariable String projectName,  
     @PathVariable String versionName, 
     @RequestPart("file") MultipartFile multipartFile, 
     @RequestPart("data") @Valid PushForm pushForm 
    ) throws IOException, BindException 
{ 
... 
} 

https://github.com/kicktipp/jlot/blob/master/jlot-web/src/main/java/org/jlot/web/api/controller/PushController.java

相關問題