我正在开发一个包含合同优先网络服务(wsimport
和jaxws-maven-plugin
)的应用程序。
我应该如何编写WSDL / XSD文件以便能够处理周期?例如,参考department
的对象employees
和参考employee
的{{1}}(如本文http://jaxb.java.net/guide/Mapping_cyclic_references_to_XML.html中所述)。本文注意到department
注释,但是当我使用契约优先时,我无法以任何方式修改生成的类。
如果我忽略这些周期,第一次运行webservice时,会收到错误,例如:
@XmlTransient
答案 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;
}
以及许多其他选项。