2010-09-09 12 views
6

मैं एक संसाधन वर्ग कि एक अंतरफलक प्रकार वापस करने का प्रयास है, कहते हैं कि "आकार":क्या जर्सी अनुरोध एक पॉलिमॉर्फिक इकाई लौटा सकता है?

public interface Shape {...} 

@XmlRootElement 
public class Circle implements Shape {...} 

@Path("/api/shapes") 
public class ShapeResource { 
    @GET 
    @Path("/{shapeId}") 
    public Shape get(@PathParam("shapeId") String shapeId) { 
     .... 
     return new Circle(); 
    } 
} 

ऊपर के साथ प्रयोग, मुझे लगता है कि सर्वर तो जैसे एक्सएमएल लौटा रहा है:

<?xml version="1.0" encoding="UTF-8"?> 
<circle> 
... 
</circle> 

अभी तक इतना अच्छा है। समस्या यह है कि क्लाइंट यह नहीं जानता कि इसे कैसे उतारना है। मैं हो रही है:

com.sun.jersey.api.client.ClientHandlerException: A message body for Java type, interface Shape, and MIME media type, application/xml, was not found 

एक WebResource को देखते हुए, और Shape.class की एक इकाई प्रकार के लिए एक अपवाद का कारण बनता है पूछ।

सर्वर सही काम कर रहा है। मैं इस वर्ग को deserialize करने के लिए ग्राहक कैसे प्राप्त करने के लिए घंटों के लिए संघर्ष कर रहा है। मैंने इंटरफ़ेस को लपेटने का भी प्रयास किया है, मैं वास्तव में यहां एक रैपर में आने की कोशिश कर रहा हूं जैसा कि यहां उल्लिखित है: https://jaxb.dev.java.net/guide/Mapping_interfaces.html। वह या तो काम नहीं किया।

मेरा ग्राहक कोड इस तरह दिखता है:

ClientResponse response = get(wr, ClientResponse.class); // wr == WebResource 
    try { 
     return response.getEntity(Shape.class); // <-- FAIL  
    } catch (Exception e) { 
     e.printStackTrace(); 
     // com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java type, interface Shape, and MIME media type, application/xml, was not found 
    } 
    try { 
     return response.getEntity(Circle.class); // <-- WIN, but hacky and forces me to try every concrete type 
    } catch (Exception e) {} 
    return null; 

किसी भी अंतर्दृष्टि या मार्गदर्शन बहुत सराहना कर रहा है। अग्रिम धन्यवाद।

+0

यह काम करना चाहिए। मैंने इसे अक्सर किया है। मुझे लगता है कि यह आपके क्लाइंट कोड में एक बग है। क्या आप इसे पोस्ट कर सकते हैं? –

+0

मैंने मूल पोस्ट – Erik

+0

हम्म अपडेट किया, क्या होता है जब आप 'आकार' में '@ XmlRootElement' जोड़ते हैं? –

उत्तर

2

समस्या शायद जेएक्सबी के कार्यान्वयन के साथ नहीं है जिसका उपयोग आप कर रहे हैं क्योंकि संदेश सही ढंग से मार्शल किया जा रहा है।

इसके बजाय समस्या निम्न कॉल के साथ है:

return response.getEntity(Shape.class); 

मुझे यकीन है कि यह कैसे कार्यान्वित किया जाता है नहीं कर रहा हूँ, लेकिन मैं कल्पना कर सकते हैं कि यह निम्नलिखित की तरह कुछ है, जो अवैध होगा करता है:

:
jaxbContext.createUnmarshaller.unmarshal(xmlSource, Shape.class); 

यह प्रतीत होता है के बाद से है कि आकार के अपने कार्यान्वयन के सभी @XmlRootElement से एनोटेट, हम JAXB के लिए निम्न कॉल को गति प्रदान करने के लिए एक रास्ता जरूरत

आप जर्सी ग्राहक एपीआई के इस बाहर doe सकता है:

URL url = new URL("http://www.example.com/api/shapes/123"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setRequestProperty("Accept", "application/xml"); 

JAXBContext jaxbContext = JAXBContext.newInstance(Circle.class, Square.class, Triangle.class); 
Shape shape = (Shape) jaxbContext.createUnmarshaller().unmarshal(connection.getInputStream()); 

connection.disconnect(); 

तो वहाँ जर्सी ग्राहक API के साथ यह करने के लिए एक तरह से किया जाना चाहिए।

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