我使用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
,則返回未定義類型的對象。我們如何將派生類投射到基類型?
我想返回一個派生類,但XML元素的類型應該始終爲Person。問題是返回元素的類型等於實際類型。例如,如果我返回EmployeePerson,類型將是'xsi:type =「employeePerson」' – nizheg 2011-06-07 09:05:41
**對編輯版本的評論:** ClientPerson也是Person,因此此代碼已編譯並可成功運行,但真正p變量執行後?此外,這個客戶端是用Java編寫的,據我所知它'知道'EmployeePerson類型。通常,WSDL沒有定義'employeePerson'類型。外部客戶端只知道在WSDL中描述的內容,但不知道實際返回的'employeePerson'類型。 – nizheg 2011-06-07 15:05:36
客戶端是在Java中創建的,但只知道WSDL,因此它不知道子類,只有Person。 p將永遠是一個Person實例。 – 2011-06-07 15:32:03