У меня есть такой класс:
@XmlRootElement(namespace = "http://foo.com/model", name = "Person")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "http://foo.com/model", name = "Person"
public abstract Person {
}
И два класса, которые наследуют от него:
@XmlRootElement(namespace = "http://foo.com/model", name = "ShortPerson")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "http://foo.com/model", name = "ShortPerson"
public ShortPerson extends Person {
}
@XmlRootElement(namespace = "http://foo.com/model", name = "TallPerson")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "http://foo.com/model", name = "TallPerson"
public TallPerson extends Person {
}
Тогда у меня есть SEI как таковой:
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED, use = SOAPBinding.Use.LITERAL, style = SOAPBinding.Style.DOCUMENT)
@WebService(targetNamespace = "http://foo.com/services")
public interface PersonService {
@RequestWrapper(localName = "getPersonById", className = "com.foo.services.personService.GetPersonById", targetNamespace = "http://foo.com/services")
@ResponseWrapper(localName = "getPersonByIdResponse", className = "com.foo.services.personService.GetPersonByUidResponse", targetNamespace = "http://foo.com/services")
@WebResult(targetNamespace = "http://foo.com/model", name = "Person")
Person getPersonById(
@WebParam(targetNamespace = "http://foo.com/services", name = "PersonId") Long personId);
}
И мой класс-оболочка ответа выглядит так:
@XmlRootElement(name = "getPersonByIdResponse", namespace = "http://foo.com/services")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getPersonByIdResponse", namespace = "http://foo.com/services", propOrder = { "person" })
public class GetPersonByIdResponse {
@XmlElementRefs( {
@XmlElementRef(name = "TallPerson", type = TallPerson.class, namespace = "http://foo.com/model"),
@XmlElementRef(name = "SmallPerson", type = SmallPerson.class, namespace = "http://foo.com/model")
})
private Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
Итак, проблема в том, что если я протестирую ResponseWrapper напрямую через JAXB и заполню объект TallPersonЯ правильно размещаю этот объект в XML, который является специфичным для TallPerson (и то же самое работает для SmallPerson).
Проблема заключается в том, что я развертываю это в войне и включаю службу, когда возвращается результат для TallPersonЯ ничего не получаю от вызова веб-службы, кроме пустого сообщения.На самом деле, я даже не получаю корневой XML-элемент оболочки ответа .
Так что моя проблема в том, есть ли у меня полиморфный объект запроса или ответа (в данном случае объект ответа), какимя WebResult / пространство имен target влияют на параметры в ResponseWrapper.Потому что в моем случае я использую XmlElementRefs для правильной компоновки моего базового объекта Person в TallPerson или SmallPerson, но как это связано с пространством имен / именем родительского класса Person в WebResult?Я не уверен, что конфликт не приводит к тому, что XML-ответ не создается.
Спасибо