6

私は zipFile といくつかの json データで応答する 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/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: 応答を抽出できませんでした: 応答タイプ [class org.jlot.client.remote.MyMultiValueMap] およびコンテンツ タイプ [multipart/form-data;boundary=Rjh-fkdsI9OIyPpYwdFY7lsUIewhRSX8kE19I; に適した HttpMessageConverter が見つかりませんでした。 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 を使用して multipart/form-data を読み取る方法はありますか、それとも HttpMessageConverter を記述する必要がありますか?

4

2 に答える 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);
    }
};

そして、このコンバーターを残りのテンプレートに追加します。

于 2013-04-03T13:39:11.493 に答える