2011-02-09 14 views
9

मैं इस सरल JAX-WS WebService है:बहुरूपी JAX-WS वेब सेवा का उपयोग करना पैरामीटर

@WebService 
public class AnimalFeedingService { 
    @WebMethod 
    public void feed(@WebParam(name = "animal") Animal animal) { 
     // Whatever 
    } 
} 

@XmlSeeAlso({ Dog.class, Cat.class }) 
public abstract class Animal { 
    private double weight; 
    private String name; 
    // Also getters and setters 
} 

public class Dog extends Animal {} 

public class Cat extends Animal {} 

मैं एक ग्राहक बना सकते हैं और Dog का एक उदाहरण के साथ feed कहते हैं।

Animal myDog = new Dog(); 
myDog .setName("Rambo"); 
myDog .setWeight(15); 
feedingServicePort.feed(myDog); 

सोप कॉल के शरीर में पशु इस तरह दिखता है:

<animal> 
    <name>Rambo</name> 
    <weight>15</weight> 
</animal> 

और मैं क्योंकि Animal एक UnmarshallException सार है मिलता है।

क्या रैम्बो को Dog वर्ग के उदाहरण के रूप में unmarshalled करने का कोई तरीका है? मेरे विकल्प क्या हैं?

उत्तर

6

आप समझ गए होंगे के रूप में, XML पार्सर जानवर आप जब का अनुरोध क्योंकि कुछ भी इसे देखता है सामान्य <animal> है इस्तेमाल किया की सटीक उप-प्रकार और टैग कि सभी प्रकार के लिए आम हैं का एक सेट है, इसलिए त्रुटि निर्धारित करने में सक्षम नहीं है। आप किस जेएक्स-डब्ल्यूएस कार्यान्वयन का उपयोग करते हैं? अनुरोध भेजते समय पॉलीमोर्फिक प्रकारों को सही तरीके से लपेटने के लिए ग्राहक की ज़िम्मेदारी है।

<animal xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:dog"> 
    <name>Rambo</name> 
    <weight>15.0</weight> 
</animal> 

xsi:type="ns2:dog" यहाँ महत्वपूर्ण है: Apache CXF में सोप अनुरोध शरीर इस तरह दिखता है (मैं नवीनतम 2.3.2 संस्करण के खिलाफ अपने कोड की जाँच की)। ऐसा लगता है कि आपके जेएक्स-डब्ल्यूएस क्लाइंट सर्वर को भ्रमित करने वाले गलत अनुरोध भेज रहा है। यह अनुरोध यह देखने के लिए कि आपका सर्वर ठीक से प्रतिक्रिया करता है या नहीं, सोपूआई जैसे किसी अन्य क्लाइंट के साथ यह अनुरोध भेजने का प्रयास करें।

जैसा कि मैंने कहा, यह स्प्रिंग/अपाचे CXF साथ ठीक है और वास्तव में एक ही कोड आपके द्वारा दिए गए काम करता है, मैं केवल निकाले जावा इंटरफ़ेस CXF खुश करने के लिए:

public interface AnimalFeedingService { 

    @WebMethod 
    void feed(@WebParam(name = "animal") Animal animal); 

} 

@WebService 
@Service 
public class AnimalFeedingServiceImpl implements AnimalFeedingService { 
    @Override 
    @WebMethod 
    public void feed(@WebParam(name = "animal") Animal animal) { 
     // Whatever 
    } 
} 

... और सर्वर/ग्राहक गोंद कोड:

<jaxws:endpoint implementor="#animalFeedingService" address="/animal"/> 

<jaxws:client id="animalFeedingServiceClient" 
       serviceClass="com.blogspot.nurkiewicz.test.jaxws.AnimalFeedingService" 
       address="http://localhost:8080/test/animal"> 
</jaxws:client> 
+0

xsi का उपयोग करना: सोपूआई से टाइप किया गया, समस्या मेरे क्लाइंट में होनी चाहिए। धन्यवाद। – adrianboimvaser

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