2012-10-23 12 views
10

Integrujemy się z firmą zewnętrzną, która wysyła xml z nagłówkiem typu treści jako text/html. Planowaliśmy użyć Spring's RestTemplate, aby odwzorować go na klasy, które wygenerowaliśmy z xsds, ale RestTemplate nie znajdzie odpowiedniego konwertera do użycia dla zawartości. Osoba trzecia odmawia naprawienia typu zawartości, ponieważ może to zepsuć integrację innego partnera.Wymuś Spring RestTemplate do użycia XmlConverter

Czy jest jakiś sposób na SpringTalk RestTemplate, aby zmusić go do użycia określonego konwertera? Jesteśmy w zasadzie tylko w następujący sposób:

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

i uzyskać następujący wyjątek:

org.springframework.web.client.RestClientException: Nie można wyodrębnić odpowiedź: brak odpowiedniego HttpMessageConverter znaleziono odpowiedzi typ [XmlClass] i typ zawartości [text/html; charset = ISO-8859-1] w org.springframework.web.client.HttpMessageConverterExtractor.extractData (HttpMessageConverterExtractor.java:84)

Odpowiedz

13

Rozwiązaniem, które zaimplementowaliśmy, było dodanie Jaxb2RootElementHttpMessageConverter z MediaType.TEXT_HTML do RestTemplateHttpMessageConverters. Nie jest idealny, ponieważ tworzy nadmiarowy konwerter wiadomości jaxb, ale działa.

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

Czy można zmienić nagłówek typu zawartości przed rozpoczęciem niszczenia, dodając niestandardowy przechwytywacz http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestInterceptor.html?

+0

Próbowałem zmienić nagłówek akceptacji za pomocą przechwytywacza, aby zachęcić ich do używania właściwego nagłówka, ale to nie zadziałało. – Nathanial

+0

Oczywiście, też bym to wypróbował. Chodzi mi o skrzypienie nagłówka * response *, po tym jak odpowiedź wróci. – artbristol

+0

Rozwiązaliśmy problem, dodając dodatkowy konwerter wiadomości do resztyTemplate, który akceptuje MediaType.TEXT_HTML. Nie jest idealny, ponieważ tworzy nadmiarowy konwerter wiadomości jaxb, ale działa - próbowałem dodać kod w odpowiedzi, ale nie pozwala mi, ponieważ nie mam przedstawiciela. – Nathanial

3

nie widzę przykład pisał o tym, jak rzeczywiście to zrobić z niestandardowym kolektora, więc tutaj jest jeden ze względu na odniesienia:

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

Następnie trzeba by dodać przechwytywania do Twój obiekt RestTemplate:

RestTemplate t = new RestTemplate(); 
t.getInterceptors().add(new MyXmlInterceptor()); 
Powiązane problemy