2013-07-17 36 views
1

我正在嘗試解決與我的RestTemplate PUT請求有關的問題。基本上,服務器期望數據(一個對象)被放在「Raw」內容類型中,但是作爲xml流。 我嘗試了許多組合(轉換器,內容類型等),但沒有任何幫助。我得到異常或者最終成爲" org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type com.test.myObject"Rest模板Spring Android PUT原始內容類型

或者:

​​

任何建議,以解決這一問題將是很有價值的。

+0

你可以發佈您如何配置你的RestTemplate?看起來你錯過了設置消息轉換器。 – gunar

+0

RestTemplate restTemplate = new RestTemplate(true); HttpHeaders headers = new HttpHeaders(); headers.setContentType(new MediaType(「application」,「Xml」)); HttpEntity requestEntity =新HttpEntity ( \t \t \t \t myObject的,標頭); ResponseEntity responseEntity = restTemplate.exchange(url, \t \t HttpMethod.PUT,requestEntity,String.class); HttpStatus status = responseEntity.getStatusCode(); – Kaps

+0

...以及您正在使用的確切內容類型? – gunar

回答

3

你可以提供自己的消息變換:

考慮,你需要發送一個自定義的內容類型,您將需要創建一個擴展AbstractHttpMessageConverter假設RawHttpMessageConverter類。您將需要爲抽象方法的具體實現:

  1. supports(...) - 隨時返回true
  2. readInternal(Class<? extends T> clazz, HttpInputMessage inputMessage) - 在這裏,你會從inputMessage.getBody() InputStream
  3. writeInternal(T t, HttpOutputMessage outputMessage)解組自定義的對象 - 在這裏你將你的馬歇爾對象T到outputMessage.getBody() OutputStream

此外,非常重要的是設置預期內容類型的列表:new MediaType("Raw", "8");和regi你的消息轉換器列表中。

這是做到這一點的一種方式。另一種方式可能是擴展現有的消息轉換器,並只提供您所需的具體實現。我可以看到您的需求的最接近的消息轉換器(如果我理解正確)是StringHttpMessageConverter。在提供實現時,您只需創建一個MediaTypes列表作爲類變量,並向其添加「Raw」類型 - 即在構造函數中。覆蓋getSupportedMediaTypes()並返回此列表。

當設置RestTemplate你將有:

 RestTemplate restTemplate = new RestTemplate(); 
     List<HttpMessageConverter<AbstractHttpMessageConverter<?>>> converters = new ArrayList<HttpMessageConverter<AbstractHttpMessageConverter<?>>>(); 
     converters.add(new RawHttpMessageConverter()); 
     restTemplate.setMessageConverters(messageConverters); 

提供更多,下面是一個自定義消息轉換器,我使用位圖下載:

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import org.springframework.http.HttpInputMessage; 
import org.springframework.http.HttpOutputMessage; 
import org.springframework.http.MediaType; 
import org.springframework.http.converter.HttpMessageConverter; 
import org.springframework.http.converter.HttpMessageNotReadableException; 
import org.springframework.http.converter.HttpMessageNotWritableException; 

import android.graphics.Bitmap; 
import android.graphics.Bitmap.CompressFormat; 
import android.graphics.BitmapFactory; 


public class BitmapMessageConverter implements HttpMessageConverter<Bitmap> { 

    private static final int BUFFER_SIZE = 8 * 1024; 
    private List<MediaType> imageMediaTypes; 

    public BitmapMessageConverter() { 
     imageMediaTypes = new ArrayList<MediaType>(); 
     imageMediaTypes.add(new MediaType("image", "*")); 
     imageMediaTypes.add(new MediaType("image", "png")); 
     imageMediaTypes.add(new MediaType("image", "jpeg")); 
    } 



    private boolean isRegisteredMediaType(MediaType mediaType) { 
     return imageMediaTypes.contains(mediaType); 
    } 

    @Override 
    public List<MediaType> getSupportedMediaTypes() { 
     return imageMediaTypes; 
    } 

    @Override 
    public Bitmap read(Class<? extends Bitmap> classArg, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 
     BufferedInputStream bis = new BufferedInputStream(inputMessage.getBody(), BUFFER_SIZE); 
     Bitmap result = BitmapFactory.decodeStream(bis); 
     return result; 
    } 

    @Override 
    public void write(Bitmap bitmap, MediaType mediaType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { 
     BufferedOutputStream bos = new BufferedOutputStream(outputMessage.getBody(), BUFFER_SIZE); 
     bitmap.compress(CompressFormat.JPEG, 100, bos); 
    } 
+0

感謝您的寶貴意見。我會爲此工作。 – Kaps