使用Java中的Contract-First进行Web服务循环

时间:2011-02-07 14:42:31

标签: java web-services xsd wsdl jax-ws

我正在开发一个包含合同优先网络服务(wsimportjaxws-maven-plugin)的应用程序。

我应该如何编写WSDL / XSD文件以便能够处理周期?例如,参考department的对象employees和参考employee的{​​{1}}(如本文http://jaxb.java.net/guide/Mapping_cyclic_references_to_XML.html中所述)。本文注意到department注释,但是当我使用契约优先时,我无法以任何方式修改生成的类。

如果我忽略这些周期,第一次运行webservice时,会收到错误,例如:

@XmlTransient

1 个答案:

答案 0 :(得分:3)

问题是webservice契约(至少符合WS-I Basic Profile的契约)不能编码对消息中其他对象的引用。也就是说,引用类型的字段总是通过编组它所引用的对象的字段来编组。如果对象图包含循环,则此递归是无限的。

也就是说,如果你有:

class A {
    String name;
    A a;
}

并做了:

A a = new A();
a.name = "hello";
a.a = a;
marshall(a);

XML看起来像

<a>
    <name>hello</name>
    <a>
        <name>hello</name>
        <a>
            <name>hello</name>
            <a>
                ...

为避免这种情况,需要打破循环。典型的方法包括使关联只能在一个方向上导航,在编组之前设置反向引用null(任务接收者重建它们),将关联移动到单独的类中,如

class A {
    String name;
}
class B {
    String adress;   
}

class AWithB {
    A a;
    B b;
}

以及许多其他选项。