【问题标题】:WebResult vs RequestWrapper Annotations with Polymophism具有多态性的 WebResult 与 RequestWrapper 注释
【发布时间】:2011-07-27 02:35:45
【问题描述】:

我有一个类,如下所示:

@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 服务调用中什么也没有收到。事实上,我什至没有收到 的响应包装器根 XML 元素。

所以我的问题是,如果我有一个多态请求或响应对象(在本例中为响应对象),WebResult 名称/目标名称空间如何影响 ResponseWrapper 中的参数。因为在我的情况下,我使用 XmlElementRefs 将我的基础对象 Person 正确编组为 TallPerson 或 SmallPerson,但这与 WebResult 上父类 Person 的命名空间/名称有什么关系?我不确定是否有冲突导致无法生成 XML 响应。

谢谢

【问题讨论】:

  • 你解决过这个问题吗?我在我的网络服务中看到类似的问题:我有一个名为 Flowers 的类和 3 个从它继承的类,玫瑰、郁金香、向日葵,由于某种原因,当我发送玫瑰和郁金香的响应时,响应不是空白的,但是当我发送向日葵时,响应为空白。如果你解决了,请告诉我

标签: jax-ws cxf jaxb2


【解决方案1】:

通过使用 XmlSeeAlso 注释服务,确保您的所有类都将加载到 JAXB 上下文中:

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

    }

而且您不需要使用包装器。 JAX-WS 会处理这个问题,它也会生成正确的 WSDL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2013-08-29
    • 1970-01-01
    相关资源
    最近更新 更多