Я пишу веб-сервисы, используя 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
, объект неопределенного типа будет возвращен. Как мы можем привести производный класс к базовому типу?