我有一个类,如下所示:
@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;
}
}
所以这里的问题是,如果我直接通过 JAXB 测试 ResponseWrapper 并填充 TallPerson 对象,我会正确地将该对象编组到特定于 TallPerson 的 XML 中(同样适用于 SmallPerson)。
问题是当我在战争中部署它并启用它时,当为 TallPerson 返回结果时,除了一条空消息外,我从 Web 服务调用中什么也没有收到。事实上,我什至没有收到 <getPersonByIdResponse> 的响应包装器根 XML 元素。
所以我的问题是,如果我有一个多态请求或响应对象(在本例中为响应对象),WebResult 名称/目标名称空间如何影响 ResponseWrapper 中的参数。因为在我的情况下,我使用 XmlElementRefs 将我的基础对象 Person 正确编组为 TallPerson 或 SmallPerson,但这与 WebResult 上父类 Person 的命名空间/名称有何关系?我不确定是否有冲突导致无法生成 XML 响应。
谢谢