WebResult vs RequestWrapper Аннотации с полимофизмом

У меня есть такой класс:

@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 влияет на параметры в ResponseWrapper. Потому что в моем случае я использую XmlElementRefs для правильной компоновки моего базового объекта Person в TallPerson или SmallPerson, но как это связано с пространством имен / именем родительского класса Person в WebResult? Я не уверен, что конфликт не приводит к тому, что XML-ответ не создается.

Спасибо

1 ответ

Убедитесь, что все ваши предложения будут загружены в контекст JAXB, аннотируя службу с помощью XmlSeeAlso:

@WebService
@XmlSeeAlso({TallPerson.class,SmallPerson.class})
public interface PersonService {
    @WebResult(name = "Person")
    Person getPersonById(
        @WebParam(name = "PersonId") Long personId);

    }

И вам не нужно играть с обертками. JAX-WS будет обрабатывать это, а также будет генерировать правильный WSDL.

Другие вопросы по тегам