2011-02-09 18 views
9

Tôi có điều này đơn giản JAX-WS WebService:Sử dụng đa hình JAX-WS webservice thông số

@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 {} 

tôi tạo ra một khách hàng và gọi feed với một thể hiện của Dog.

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

Các động vật trong cơ thể của cuộc gọi SOAP trông như thế này:

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

và tôi nhận được một UnmarshallExceptionAnimal là trừu tượng.

Có cách nào để có Rambo không được sửa đổi như một thể hiện của lớp Dog? Lựa chọn thay thế của tôi là gì?

Trả lời

6

Như bạn có thể đã đoán, trình phân tích cú pháp XML không thể xác định loại con chính xác của động vật bạn đã sử dụng khi yêu cầu bởi vì bất kỳ thứ gì mà nó nhìn thấy là chung chung <animal> và một bộ thẻ phổ biến cho tất cả các loại. Bạn sử dụng cài đặt JAX-WS nào? Đó là trách nhiệm của khách hàng để bọc đúng các loại đa hình khi gửi yêu cầu. Trong Apache CXF (tôi đã kiểm tra mã của bạn chống lại phiên bản mới nhất 2.3.2) theo yêu cầu cơ thể SOAP trông như thế này:

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

Các xsi:type="ns2:dog" là rất quan trọng ở đây. Dường như máy khách JAX-WS của bạn đang gửi yêu cầu không chính xác gây nhầm lẫn cho máy chủ. Hãy thử gửi yêu cầu này với một số ứng dụng khách khác, như SoapUI, để xem liệu máy chủ của bạn có phản ứng đúng cách hay không.

Như tôi đã nói, nó chỉ hoạt động tốt với mùa xuân/Apache CXF và chính xác cùng một mã mà bạn đã cung cấp, tôi giao diện Java chỉ trích để làm CXF hạnh phúc:

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

... và máy chủ/mã keo của khách hàng:

<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

Sử dụng xsi: loại từ SoapUI đã hoạt động, sự cố phải nằm trong ứng dụng khách của tôi. Cảm ơn. – adrianboimvaser

Các vấn đề liên quan