我使用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