JAXB: Как можно вернуть производный объект как элемент XML базового типа? - PullRequest
3 голосов
/ 06 июня 2011

Я пишу веб-сервисы, используя jax-ws, а wsdl содержит множество типов. Классы Java для сопоставления XML с использованием jaxb. Давайте посмотрим на следующий пример:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Person")
public class Person {    
    @XmlElement(name = "firstName")
    protected String firstName;    
    @XmlElement(name = "lastName")
    protected String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String value) {
        this.firstName = value;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String value) {
        this.lastName = value;
    }
}

Итак, у нас есть XML-тип Person, который включен в WSDL. Этот класс мы можем назвать интерфейсным классом (для клиентов веб-сервиса). Код сервера может иметь набор производных классов. Например,

public class EmployeePerson extends Person {
    protected String post;
}

public class ClientPerson extends Person {
}

Операция веб-сервиса возвращает объект типа Person:

@WebMethod(operationName = "GETPERSON")
public Person getPerson(@WebParam(name = "ID") String personId);

На самом деле мы можем вернуть один из производных типов, но тип XML Person должен быть возвращен клиенту (xsi:type='ns:Person'). Если мы используем @XmlTransient, объект неопределенного типа будет возвращен. Как мы можем привести производный класс к базовому типу?

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Я понял, где был мой непонятый.Нет необходимости явно определять «xsi: type» в ответе веб-службы, поскольку он описывается WSDL.Когда мы возвращаем производный класс, тип необходим, потому что клиент должен знать, как он может удалить экземпляр.В соответствии с этим использование аннотации @XmlTransient в производном типе является правильным способом, если мы хотим всегда возвращать точно экземпляр родительского класса.

1 голос
/ 07 июня 2011

Вы хотите вернуть всегда Person?Если это так, вам не нужно беспокоиться об этом, когда вы

возвращаете someEmployeePerson

, оно будет возвращено как Person.

РЕДАКТИРОВАТЬ: Я создаю тестовый пример:

Человек

public class Person {
        public Person() {...}
        public Person(String name) {...}
        public String getName() {...}
        public void setName(String name) {...}

        private String name;
}

ClientPerson

public class ClientPerson extends Person {
        public ClientPerson() {...}
        public ClientPerson(String name, Double payment) {...}
        public Double getPayment() {...}
        public void setPayment(Double payment) {...}

        private Double payment;
}

Веб-сервис

@WebService()
public class testePerson {

        @WebMethod
        public Person getPeople() {
                return new ClientPerson("Some Name", 100.0);
        }
}

example.TestePersonService service = new example.TestePersonService();
example.TestePerson port = service.getTestePersonPort();
Person p = port.getPeople();

Когда вы выполните это, результатом будет Person, объект.На самом деле WSDL объявляет только о персонале.

...