【问题标题】:Rest Template Spring Android PUT with Raw content type具有原始内容类型的 Rest Template Spring Android PUT
【发布时间】:2013-07-17 08:55:22
【问题描述】:

我正在尝试解决我的RestTemplate PUT 请求的问题。基本上,服务器期望数据(一个对象)被放入“原始”内容类型,但作为 xml 流。 我尝试了许多组合(转换器、内容类型等),但没有任何帮助。我要么最终以" org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type com.test.myObject" 的身份出现异常

或者:

"The server encountered an error processing the request. 
The exception message is 'Incoming message for operation 'SendRequest' contains
an unrecognized http body format value 'Xml'. The expected body format value is 'Raw'. 
This can be because a WebContentTypeMapper has not been configured on the binding.
".

任何解决此问题的建议都将非常有价值。

【问题讨论】:

  • 你能发布你是如何配置你的 RestTemplate 的吗?您似乎错过了设置消息转换器。
  • RestTemplate restTemplate = new RestTemplate(true); HttpHeaders 标头 = 新的 HttpHeaders(); headers.setContentType(new MediaType("application", "Xml")); HttpEntity requestEntity = new HttpEntity(myObject, headers); ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.PUT, requestEntity, String.class); HttpStatus 状态 = responseEntity.getStatusCode();
  • ...以及您正在使用的确切内容类型?
  • 服务器期望内容类型为“原始”。当我将代码修改为 headers.setContentType(new MediaType("application", "Raw"));我得到异常,org.springframework.web.client.RestClientException:无法写入请求:没有为请求类型 com.test.myObject 找到合适的 HttpMessageConverter
  • 我无法控制服务器的实现。需要找出一种方法来 PUT/POST 保持内容类型为 Raw 的数据。

标签: android spring resttemplate


【解决方案1】:

您可以提供自己的消息转换器:

考虑到您需要发送自定义 Content-Type,您需要创建一个扩展 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"); 并注册到您的消息转换器列表中。

这是一种方法。另一种方法可能是扩展现有的消息转换器并仅针对您需要的内容提供具体实现。我能看到的最符合您需求的消息转换器(如果我理解正确的话)是StringHttpMessageConverter。提供实现时,您只需创建一个 MediaType 列表作为类变量,并向其添加“原始”类型 - 在构造函数中。覆盖 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);
    }

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 2018-09-10
    • 2013-02-16
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多