Spring REST - Can a RestTemplate consume multipart

2019-08-04 05:17发布

我想写这确实与一个zip文件和一些JSON数据,一切都在一个多/混合请求responed REST服务。

服务器部分工作正常,但我是从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的帮助下发出的multipart开箱。

现在,我试图消耗多/混合响应并返回一个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:无法提取响应:没有合适HttpMessageConverter找到的响应类型[类org.jlot.client.remote.MyMultiValueMap]和内容类型[多部分/格式数据;边界= RJH-fkdsI9OIyPpYwdFY7lsUIewhRSX8kE19I;字符集= UTF-8]在org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:107)在org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:492)

FormHttpMessageConverter的Javadoc中说,能写,但不能读的multipart / form-data的。

为什么会这样呢?

有没有办法出的现成或者我需要写一个HttpMessageConverter与RestTemplate读的multipart / form-data的?

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

而这个转换器添加到您的休息模板。



Answer 2:

我用眼前这个解决方案:

@ResponseBody
@PostMapping(value = JlotApiUrls.PUSH, produces = "application/json")
public List<PushResultDTO> push ( 
        @PathVariable String projectName,       
        @PathVariable String versionName, 
        @RequestPart("file") MultipartFile multipartFile, 
        @RequestPart("data") @Valid PushForm pushForm 
   ) throws IOException, BindException
{
 ...
}

https://github.com/kicktipp/jlot/blob/master/jlot-web/src/main/java/org/jlot/web/api/controller/PushController.java



文章来源: Spring REST - Can a RestTemplate consume multipart/mixed?