我使用jax-ws编写Web服务,wsdl包含一组类型。使用jaxb的Java类到XML mapps。我们来看下面的例子:
@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);
实际上我们可以返回一个派生类型,但是'Person'XML类型应该返回给客户端(xsi:type='ns:Person'
)。
如果我们使用@XmlTransient
,将返回未定义类型的对象。我们如何将派生类转换为基类型?
答案 0 :(得分: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;
}
网络服务
@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 Class。
答案 1 :(得分:1)
我遇到了被误解的地方。在Web服务响应中明确定义'xsi:type'是不必要的,因为WSDL描述了一个'xsi:type'。当我们返回派生类时,类型是必要的,因为客户端应该知道它如何解组实例。根据这个,如果我们想要总是返回父类的实例,那么在派生类型上使用@XmlTransient
注释是正确的方法。