2011-06-06 94 views
3

我使用jax-ws編寫web服務,而wsdl包含一組類型。使用jaxb將Java類轉換爲XML mapps。我們來看下面的例子:JAXB:如何將派生對象作爲基本類型的XML元素返回?

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Person") 
public class Person {  
    @XmlElement(name = "firstName") 
    protected String firstName;  
    @XmlElement(name = "lastName") 
    protected String lastName; 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String value) { 
     this.firstName = value; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String value) { 
     this.lastName = value; 
    } 
} 

所以我們有'Person'XML類型包含在WSDL中。我們可以將這個類命名爲接口類(用於Web服務客戶端)。服務器代碼可以有一組派生類。例如,

public class EmployeePerson extends Person { 
    protected String post; 
} 

public class ClientPerson extends Person { 
} 

的Web服務操作返回Person類型的對象:

@WebMethod(operationName = "GETPERSON") 
public Person getPerson(@WebParam(name = "ID") String personId); 

其實我們可以返回派生類型之一,但「人」的XML類型應該返回到客戶端(xsi:type='ns:Person') 。 如果我們使用@XmlTransient,則返回未定義類型的對象。我們如何將派生類投射到基類型?

回答

1

想要永遠返回Person?如果是這樣,你不必擔心,當你做

回報someEmployeePerson

將返回一個Person

編輯: 我創建測試例如:


public class Person { 
     public Person() {...} 
     public Person(String name) {...} 
     public String getName() {...} 
     public void setName(String name) {...} 

     private String name; 
} 

ClientPerson

public class ClientPerson extends Person { 
     public ClientPerson() {...} 
     public ClientPerson(String name, Double payment) {...} 
     public Double getPayment() {...} 
     public void setPayment(Double payment) {...} 

     private Double payment; 
} 

Web服務

@WebService() 
public class testePerson { 

     @WebMethod 
     public Person getPeople() { 
       return new ClientPerson("Some Name", 100.0); 
     } 
} 

example.TestePersonService service = new example.TestePersonService(); 
example.TestePerson port = service.getTestePersonPort(); 
Person p = port.getPeople(); 

當您執行這一點,結果是Person,對象。事實上,WSDL只宣佈Person類。

+0

我想返回一個派生類,但XML元素的類型應該始終爲Person。問題是返回元素的類型等於實際類型。例如,如果我返回EmployeePerson,類型將是'xsi:type =「employeePerson」' – nizheg 2011-06-07 09:05:41

+0

**對編輯版本的評論:** ClientPerson也是Person,因此此代碼已編譯並可成功運行,但真正p變量執行後?此外,這個客戶端是用Java編寫的,據我所知它'知道'EmployeePerson類型。通常,WSDL沒有定義'employeePerson'類型。外部客戶端只知道在WSDL中描述的內容,但不知道實際返回的'employeePerson'類型。 – nizheg 2011-06-07 15:05:36

+0

客戶端是在Java中創建的,但只知道WSDL,因此它不知道子類,只有Person。 p將永遠是一個Person實例。 – 2011-06-07 15:32:03

0

我有我誤解的地方。在Web服務響應中顯式定義'xsi:type'是不必要的,因爲WSDL描述了一個。當我們返回派生類時,類型是必需的,因爲客戶端應該知道它如何解除實例。據此,如果我們總是要返回父類的實例,那麼使用@XmlTransient派生類型的註釋是正確的方法。

相關問題