Spring REST - RestTemplate是否能够消费multipart/mixed?

6
我希望编写一个REST服务,它可以在一个multipart/mixed请求中同时响应zip文件和JSON数据。
服务器端部分已经正常运行,并使用来自Firefox的REST客户端进行测试。我的服务器会发送一个类似以下格式的multipart响应:
--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/mixed响应并返回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 out-of-the-box 读取 multipart/form-data,还是我需要编写一个 HttpMessageConverter?

你解决了你的问题吗?下面的答案对我不起作用。 - Rajesh
2个回答

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);
    }
};

将此转换器添加到您的rest模板中。


1
我已经尝试了这种方法,但是MyMultiValueMap不能正确地区分application/octet-stream和application/json。我们如何才能正确地区分这两个呢?根据以下链接(http://mfjassociates.blogspot.in/2012/02/handling-multipart-form-data-in-spring.html),multipart/mixed没有得到很好的支持?这不可能吗? - Rajesh

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接