복붙노트

[SPRING] Spring RestTemplate이 XmlConverter를 사용하도록 강제 실행

SPRING

Spring RestTemplate이 XmlConverter를 사용하도록 강제 실행

우리는 content-type 헤더가 text / html 인 xml을 보내는 제 3 자와 통합하고 있습니다. 우리는 Spring의 RestTemplate을 사용하여 xsds에서 생성 한 클래스에 매핑하려고했지만 RestTemplate은 컨텐츠에 사용할 적절한 변환기를 찾지 못했습니다. 타사는 다른 파트너의 통합을 깨기 때문에 콘텐츠 유형을 수정하지 않습니다.

Spring의 RestTemplate이 특정 변환기를 사용하도록 강제하는 방법이 있습니까? 기본적으로 다음을 수행합니다.

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

그리고 다음 예외를 얻으십시오 :

해결법

  1. ==============================

    1.우리가 구현 한 솔루션은 MediaType.TEXT_HTML이있는 Jaxb2RootElementHttpMessageConverter를 RestTemplate HttpMessageConverters에 추가하는 것이 었습니다. 그것은 여분의 jaxb 메시지 변환기를 생성하기 때문에 이상적이지는 않지만 작동합니다.

    우리가 구현 한 솔루션은 MediaType.TEXT_HTML이있는 Jaxb2RootElementHttpMessageConverter를 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);
    
  2. ==============================

    2.나는 커스텀 인터셉터를 가지고 이것을 실제로 수행하는 방법에 대한 예제를 보지 못했고, 그래서 여기에 대한 참조가있다.

    나는 커스텀 인터셉터를 가지고 이것을 실제로 수행하는 방법에 대한 예제를 보지 못했고, 그래서 여기에 대한 참조가있다.

    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());
    
  3. ==============================

    3.언 마샬링이 발생하기 전에 사용자 정의 인터셉터를 추가하여 content-type 헤더를 변경할 수 있습니까? http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestInterceptor.html?

    언 마샬링이 발생하기 전에 사용자 정의 인터셉터를 추가하여 content-type 헤더를 변경할 수 있습니까? http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestInterceptor.html?

  4. from https://stackoverflow.com/questions/13038529/force-spring-resttemplate-to-use-xmlconverter by cc-by-sa and MIT license