2011-06-06 98 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派生类型的注释是正确的方法。

相关问题