2012-10-23 14 views
10

का उपयोग करने के लिए हम एक तीसरे पक्ष के साथ एकीकृत कर रहे हैं जो सामग्री-प्रकार हेडर के साथ टेक्स्ट/एचटीएमएल के रूप में एक्सएमएल भेज रहा है। हम xsds से जेनरेट की गई कक्षाओं में इसे मैप करने के लिए स्प्रिंग के रेस्ट टेम्पलेट का उपयोग करने की योजना बना रहे थे, लेकिन RestTemplate सामग्री के लिए उपयोग करने के लिए उपयुक्त कनवर्टर खोजने में विफल रहता है। तीसरी पार्टी सामग्री-प्रकार को ठीक करने से इंकार कर देती है क्योंकि यह अन्य साथी के एकीकरण को तोड़ सकती है।फोर्स स्प्रिंग रेस्ट टेम्पलेट एक्सएमएल कनवर्टर

क्या स्प्रिंग के रेस्ट टेम्पलेट के साथ एक विशिष्ट कनवर्टर का उपयोग करने के लिए मजबूर करने का कोई तरीका है? हम मूल रूप से बस कर रहे हैं निम्नलिखित:

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

और निम्न अपवाद:

org.springframework.web.client.RestClientException: प्रतिक्रिया को अलग नहीं किया जा सका: कोई उपयुक्त HttpMessageConverter प्रतिक्रिया के लिए मिला टाइप [XmlClass] और सामग्री प्रकार [पाठ/html; charset = ISO-8859-1] org.springframework.web.client.HttpMessageConverterExtractor.extractData (HttpMessageConverterExtractor.java:84)

01 पर

उत्तर

13

हमारे द्वारा लागू समाधान Jaxb2RootElementHttpMessageConverterMediaType.TEXT_HTMLRestTemplateHttpMessageConverters पर जोड़ने के लिए था। यह आदर्श नहीं है क्योंकि यह एक अनावश्यक जैक्सब संदेश कनवर्टर बनाता है लेकिन यह काम करता है।

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 = 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

क्या कस्टम इंटरसेप्टर http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestInterceptor.html जोड़कर, अनमर्शलिंग होने से पहले आप सामग्री-प्रकार शीर्षलेख बदल सकते हैं?

+0

मैंने सही हेडर का उपयोग करने के लिए प्रोत्साहित करने के लिए इंटरसेप्टर के साथ स्वीकृति हेडर बदलने की कोशिश की लेकिन यह काम नहीं किया। – Nathanial

+0

निश्चित रूप से, मैंने भी कोशिश की होगी। मेरा जवाब प्रतिक्रिया के बाद, प्रतिक्रिया * हेडर को झुकाव का मतलब है। – artbristol

+0

हमने MediaType.TEXT_HTML को स्वीकार करने वाले बाकी टेम्पलेट को अतिरिक्त संदेश कनवर्टर जोड़कर समस्या हल की। यह आदर्श नहीं है क्योंकि यह एक अनावश्यक जैक्सब संदेश कनवर्टर बनाता है, लेकिन यह काम करता है - मैंने कोड को एक उत्तर में जोड़ने का प्रयास किया, लेकिन यह मुझे तब तक नहीं जाने देगा जब तक मेरे पास प्रतिनिधि नहीं है। – Nathanial

3

मैं एक उदाहरण है कि कैसे वास्तव में एक कस्टम इंटरसेप्टर के साथ ऐसा करने की पोस्ट नहीं देखा था, इसलिए यहाँ संदर्भ के लिए एक है आपके RestTemplate ऑब्जेक्ट:

RestTemplate t = new RestTemplate(); 
t.getInterceptors().add(new MyXmlInterceptor()); 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^