Spring REST - RestTemplate 可以使用多部分/混合吗?

标签 spring spring-mvc resttemplate multipartform-data

我想编写一个 REST 服务,它确实响应一个 zipFile 和一些 json 数据,所有内容都在一个多部分/混合请求中。

服务器部分工作正常,我正在使用 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 的帮助下发送多部分。

现在我尝试使用多部分/混合响应并返回 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: Could not extract response: no suitable HttpMessageConverter found for response type [class org.jlot.client.remote.MyMultiValueMap] and content type [multipart/form-data;boundary=Rjh-fkdsI9OIyPpYwdFY7lsUIewhRSX8kE19I;charset=UTF-8] at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:107) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:492)



FormHttpMessageConverter 的 Javadoc 说它可以写入但不能读取 multipart/form-data。

为什么会这样?

有没有办法用 RestTemplate 开箱即用地读取多部分/表单数据,或者我是否需要编写一个 HttpMessageConverter?

最佳答案

我有同样的问题,我想我实现了你想要的。
你只需要覆盖 canRead形式转换器的方法。使用您的示例,如下所示应该可以工作。

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

并将此转换器添加到您的休息模板。

关于Spring REST - RestTemplate 可以使用多部分/混合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13918459/

相关文章:

java - 在名为 xx 的 DispatcherServlet 中未找到具有 URI xxx 的 HTTP 请求的映射

java - TilesViewResolver 在部署为 war 时不工作

java - 不允许加载本地资源: Why?

java - 在 RestTemplate 客户端获取从服务器抛出的异常的描述性自定义消息

java - 使用 Spring MVC 提交表单时出错 - HTTP 状态 404

java - 在查找方法中使用表达式

java - spring mvc Controller 内的私有(private)方法是线程安全的

java - 通过Spring rest模板下载大文件

java - 如何在不将文件保存到磁盘的情况下将 BufferedImage 转换为多部分文件?

java - Resteasy/Spring Security + Oauth 2.0 - 错误 404