2011-03-31 15 views
4

我有一個類,如下面的RequestWrapper此類註釋:WebResult VS與多態

@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這樣:從繼承

@XmlRootElement(namespace = "http://foo.com/model", name = "Person") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(namespace = "http://foo.com/model", name = "Person" 
public abstract Person { 
} 

和兩個班

@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響應無法生成。

感謝

+0

你曾經解決過這個問題嗎? 我看到在我的web服務類似的問題: 我有一個花 3班類命名,從它,玫瑰,鬱金香,由於某種原因,向日葵 繼承,當我玫瑰和鬱金香的發送resposne,響應心不是空白,但是當我發送SunFlowers時,回覆是空白的。如果你解決了它,請告訴我 – 2013-09-04 15:53:34

回答

0

確保所有clases將通過與XmlSeeAlso標註服務被loded到JAXB方面:

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

    } 

而且你也不需要包裝的發揮。 JAX-WS將處理這個問題,它也會生成正確的WSDL。