android - 具有原始内容类型的 Rest 模板 Spring Android PUT

标签 android spring resttemplate

我正在尝试解决我的 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.
".

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

最佳答案

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

考虑到您需要发送自定义内容类型,您将需要创建一个扩展 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 .在提供实现时,您只需创建一个 MediaTypes 列表作为类变量,并向其添加“原始”类型——在构造函数中。覆盖 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);
    }

关于android - 具有原始内容类型的 Rest 模板 Spring Android PUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17695358/

相关文章:

android - 我如何在 MaterialBetterSpinner 库上实现 onItemSelected

android - Google Firebase 在 Android 应用中注销并忘记用户

Android SoundPool声音播放时断时续

java - 如何使用 spring-ldap 从 ldap 读取值

java - 发送查询参数时 POST 请求出现 I/O 错误

java - 如何访问 Galaxy S5 心率传感器?

java - Spring Boot 数据休息 Jakson JSONSerializer 空

spring - MessagingException : Failed to execute on session; nested exception is java. lang.IllegalStateException:无法创建 SFTP session

spring - 从 DTO 填充查询参数

java - tomcat 上的 JVM 代理参数出现间歇性 503 问题