2011-11-19 20 views
5

मैं किसी तृतीय पक्ष सेवा प्रदाता से कनेक्ट करने के लिए क्लाइंट बनाने के लिए अपने JAX-RS कार्यान्वयन के रूप में RESTEasy 2.2.1.GA का उपयोग कर रहा हूं। (Education.com के REST API का यह मायने रखता है तो)मैं जेएक्स-आरएस सामग्री बातचीत के दौरान किए गए निर्णयों को कैसे ओवरराइड कर सकता हूं?

सुनिश्चित करने के लिए मैं एक महत्वपूर्ण कार्यान्वयन विस्तार यहाँ याद नहीं है कोड नमूने हैं:

सेवा इंटरफ़ेस

@Path("/") 
public interface SchoolSearch { 

@GET 
@Produces({MediaType.APPLICATION_XML}) 
Collection<SchoolType> getSchoolsByZipCode(@QueryParam("postalcode") int postalCode); 
} 

कक्षा कॉलिंग

public class SimpleSchoolSearch { 

public static final String SITE_URL = "http://api.education.com/service/service.php?f=schoolSearch&key=****&sn=sf&v=4"; 

SchoolSearch service = ProxyFactory.create(SchoolSearch.class, SITE_URL); 

public Collection<SchoolType> getSchools() throws Exception { 
    Collection<SchoolType> schools = new ArrayList<SchoolType>(); 
    Collection<SchoolType> response = service.getSchoolsByZipCode(35803); 
    schools.addAll(response); 
    return schools; 

} 
} 

इस कॉल को करने के लिए परीक्षण स्थापित करने के बाद, मैं निम्नलिखित अपवाद को निष्पादित और निष्पादित करता हूं।

org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException: Unable to find JAXBContext for media type: text/html;charset="UTF-8" 

RESTEasy/JAX-आरएस प्रलेखन पढ़ने, मैं यह समझ के रूप में, जब प्रतिक्रिया ग्राहक के लिए दिया जाता है से उस डेटा के unmarshaling करने से पहले, एक दृढ़ संकल्प (सामग्री बातचीत ??) के बारे में किया जाता है unmarshalling के लिए उपयोग करने के लिए कौन सी तंत्र। (मुझे लगता है कि हम यहां एक संदेशबॉडी रीडर के बारे में बात कर रहे हैं लेकिन मुझे यकीन नहीं है।) प्रतिक्रिया के शरीर को देखने से, मैं देखता हूं कि वापस लौटाया गया है एक्सएमएल, लेकिन सामग्री बातचीत (HTTP शीर्षलेख सामग्री- प्रकार वास्तव में पाठ/एचटीएमएल है; वर्णसेट = "यूटीएफ -8") पाठ को JAXB द्वारा पारदर्शी करने की अनुमति नहीं दे रहा है।

मुझे लगता है कि कार्यान्वयन सही तरीके से व्यवहार कर रहा है, और यह सेवा है जो त्रुटि में है, हालांकि, मैं सेवा को नियंत्रित नहीं करता हूं, लेकिन फिर भी इसे उपभोग करना चाहूंगा।

तो कहा जा रहा है कि:

हूँ मैं की मेरी समझ में सही कर क्यों अपवाद फेंक दिया जाता है?

मैं इसके आसपास कैसे काम करूं?

क्या कोई साधारण एक पंक्ति एनोटेशन है जो जेएक्सबी को डेटा को अनमर्शल करने के लिए मजबूर कर सकता है, या मुझे कस्टम संदेशबॉडी रीडर को लागू करने की आवश्यकता होगी? (यदि यह लागू करने के लिए भी सही वर्ग है)।

धन्यवाद!

फ़ॉलो अप:

मैं सिर्फ मैं Eiden के जवाब में किए गए कुछ परिवर्तन पोस्ट करना चाहता था। मैंने अपने कोड और Resteasy ClientExecutionInterceptor documentation पर उपलब्ध जानकारी का उपयोग कर क्लाइंट एक्सेक्यूशनइंटरसेप्टर बनाया। मेरे अंतिम वर्ग लग रहा है बड़ा अंतर

तरह
@Provider 
@ClientInterceptor 
public class SimpleInterceptor implements ClientExecutionInterceptor { 

@Override 
    public ClientResponse execute(ClientExecutionContext ctx) throws Exception { 
     final ClientResponse response = ctx.proceed(); 
     response.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML); 
     return response; 
    } 
} 

@Provider और @ClientExecutionInterceptor एनोटेशन की है। यह बीमा करना चाहिए कि इंटरसेप्टर ठीक से पंजीकृत है।

इसके अलावा, केवल पूर्णता के लिए, मैंने अपने परीक्षणों के लिए इंटरसेप्टर को थोड़ा अलग तरीके से पंजीकृत किया। मैं प्रयोग किया है:

 providerFactory.registerProvider(SimpleInterceptor.class); 

उत्तर

2

मुझे यकीन है कि इस समस्या के कई समाधान हैं, लेकिन मैं केवल एक के बारे में सोच सकता हूं।

तो एक ClientExecutionInterceptor का उपयोग कर सामग्री प्रकार सेट करने का प्रयास करें:

public class Interceptor implements ClientExecutionInterceptor { 

    @Override 
    public ClientResponse<?> execute(ClientExecutionContext ctx) throws Exception { 
     final ClientResponse<?> response = ctx.proceed(); 

     response 
      .getHeaders() 
      .putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML); 

     return response; 
    } 

} 

public void getSchools() throws Exception { 
    ResteasyProviderFactory.getInstance() 
     .getClientExecutionInterceptorRegistry() 
     .register(new Interceptor()); 

    SchoolSearch service = 
      ProxyFactory.create(SchoolSearch.class, SITE_URL); 
} 
+0

यह एक बहुत सीधे आगे काम नहीं है एक बार आप इसे इस तरह से बाहर करना। – jholder

0

मैं किसी भी तरह के एनोटेशन के बारे में नहीं जानता, दूसरों कर सकते हैं, लेकिन कोई समाधान एक स्थानीय प्रॉक्सी बनाने के लिए है। एक नियंत्रक बनाएं, जो java.Net.URL का उपयोग करके Education.com पर सभी पैरामीटर पास करता है।प्राप्त करें() आपको प्राप्त उत्तर लौटाएं, लेकिन शीर्षलेख को संशोधित करें। फिर अपने क्लाइंट को स्थानीय प्रॉक्सी नियंत्रक से कनेक्ट करें।

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