JAXB:派生对象如何作为基类型的XML元素返回?

时间:2011-06-06 09:21:07

标签: jaxb jax-ws

我使用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,将返回未定义类型的对象。我们如何将派生类转换为基类型?

2 个答案:

答案 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注释是正确的方法。