Выделение полиморфных объектов в JAX-WS - PullRequest
12 голосов
/ 22 июля 2009

Я создаю веб-сервис типа JAX-WS с операциями, которые возвращают объект WebServiceReply. Класс WebServiceReply сам содержит поле типа Object. Отдельные операции будут заполнять это поле несколькими различными типами данных, в зависимости от операции.

Публикация WSDL (я использую Netbeans 6.7) и получение приложения ASP.NET для извлечения и анализа WSDL - это нормально, но при попытке вызвать операцию я получаю следующее исключение:

javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException
 - with linked exception:
[javax.xml.bind.JAXBException: class [LDataObject.Patient; nor any of its super class is known to this context.]

Как пометить аннотации в классе DataObject.Patient, а также в классе WebServiceReply, чтобы он работал? Я не смог найти точный ресурс по сортировке на основе аннотаций в целевых классах, поэтому было бы здорово, если бы кто-нибудь мог указать мне на это.

WebServiceReply.java

@XmlRootElement(name="WebServiceReply")
public class WebServiceReply {


    private Object returnedObject;
    private String returnedType;
    private String message;
    private String errorMessage;

    .......... // Getters and setters follow

}

DataObject.Patient.java

@XmlRootElement(name="Patient")

public class Patient {

    private int uid;
    private Date versionDateTime;
    private String name;
    private String identityNumber;

    private List<Address> addressList;
    private List<ContactNumber> contactNumberList;
    private List<Appointment> appointmentList;
    private List<Case> caseList;
}

Решение

(Спасибо Григорию Мостизскому за ответ)

Я отредактировал класс WebServiceReply, чтобы все возможные возвращаемые объекты были расширены из нового класса ReturnValueBase, и добавил аннотации, используя @XmlSeeAlso, в ReturnValueBase. JAXB работал правильно после этого!

Тем не менее, я все еще изучаю маршаллинг JAXB в JAX-WS, поэтому было бы здорово, если бы кто-нибудь еще мог опубликовать какое-либо руководство по этому вопросу.

Грегори: вы можете захотеть добавить к своему ответу, что возвращаемые объекты должны быть подклассом из ReturnValueBase. Большое спасибо за вашу помощь! Я так долго шутил над этой проблемой!

1 Ответ

15 голосов
/ 22 июля 2009

Вам необходимо использовать @ XmlSeeAlso , чтобы ваша реализация JAXB теперь могла включать и дополнительные классы.

В вашем случае это будет выглядеть примерно так:

@XmlRootElement
@XmlSeeAlso({Patient.class, ....})
public class ReturnValueBase {
}

А также измените свойство returnObject на тип ReturnValueBase.

...