14

私たちは、text/htmlとしてcontent-typeヘッダーを持つxmlを送信しているサードパーティと統合しています。SpringのRestTemplateを使用して、xsdsから生成したクラスにマップすることを計画していましたが、RestTemplateは、コンテンツに使用する適切なコンバーターを見つけることができません。サードパーティは、他のパートナーの統合を壊す可能性があるため、コンテンツタイプの修正を拒否します。

SpringのRestTemplateを使用して、特定のコンバーターを使用するように強制する方法はありますか?基本的には次のことを行っています。

RestTemplate restTemplate = new RestTemplate();
XmlClass xmlClass = restTemplate.getForObject("http://example.com/", XmlClass.class);

そして、次の例外が発生します。

org.springframework.web.client.RestClientException:応答を抽出できませんでした:org.springframework.web.clientで応答タイプ[XmlClass]およびコンテンツタイプ[text / html; charset=ISO-8859-1]に適したHttpMessageConverterが見つかりませんでした。 HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:84)

4

3 に答える 3

21

実装したソリューションは、にJaxb2RootElementHttpMessageConverterwithMediaType.TEXT_HTMLを追加することでしたRestTemplate HttpMessageConverters。冗長なjaxbメッセージコンバーターを作成するため理想的ではありませんが、機能します。

RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
Jaxb2RootElementHttpMessageConverter jaxbMessageConverter = new Jaxb2RootElementHttpMessageConverter();
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.TEXT_HTML);
jaxbMessageConverter.setSupportedMediaTypes(mediaTypes);
messageConverters.add(jaxbMessageConverter);
restTemplate.setMessageConverters(messageConverters);
于 2012-10-23T23:50:50.660 に答える
5

カスタムインターセプターを使用して実際にこれを行う方法の例が投稿されていないので、参考のために以下を示します。

public class MyXmlInterceptor implements ClientHttpRequestInterceptor {

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    ClientHttpResponse response = execution.execute(request, body);
    HttpHeaders headers = response.getHeaders();

    // you'd want to check if the value needs to be changed
    if (headers.containsKey("Content-Type")) {
        headers.remove("Content-Type");
    }

    headers.add("Content-Type", "application/xml");

    return response;
}

次に、RestTemplateオブジェクトにインターセプターを追加する必要があります。

RestTemplate t = new RestTemplate();
t.getInterceptors().add(new MyXmlInterceptor());
于 2015-02-10T18:40:55.227 に答える
0

カスタムインターセプターhttp://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestInterceptor.htmlを追加して、アンマーシャリングが発生する前にcontent-typeヘッダーを変更できますか?

于 2012-10-23T20:52:26.263 に答える