首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中使用约定优先的Web服务循环

在Java中使用约定优先的Web服务循环
EN

Stack Overflow用户
提问于 2011-02-07 22:42:31
回答 1查看 789关注 0票数 4

我正在开发一个具有契约优先web服务(wsimportjaxws-maven-plugin)的应用程序。

我应该如何编写WSDL/XSD文件才能处理周期?例如,引用employees的对象department和引用departmentemployee (如本文中的http://jaxb.java.net/guide/Mapping_cyclic_references_to_XML.html )。本文介绍了一个@XmlTransient注释,但由于我使用的是contract-first,因此无法以任何方式修改生成的类。

如果我忽略这些循环,那么第一次运行run服务时,我会收到如下错误:

代码语言:javascript
复制
Caused by: com.sun.istack.SAXException2: 
A cycle is detected in the object graph. This will cause infinitely deep XML: 
Employee@18ac4d8 -> Department@aa35d5 -> Employee@18ac4d8
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-08 02:53:46

问题在于,WS服务约定(至少是与WS-I基本概要兼容的约定)不能编码对消息中其他对象的引用。也就是说,引用类型的字段总是通过封送它所引用的对象的字段来封送。如果对象图包含循环,则这种递归是无限的。

也就是说,如果你有:

代码语言:javascript
复制
class A {
    String name;
    A a;
}

并做到了:

代码语言:javascript
复制
A a = new A();
a.name = "hello";
a.a = a;
marshall(a);

XML应该看起来像这样

代码语言:javascript
复制
<a>
    <name>hello</name>
    <a>
        <name>hello</name>
        <a>
            <name>hello</name>
            <a>
                ...

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

代码语言:javascript
复制
class A {
    String name;
}
class B {
    String adress;   
}

class AWithB {
    A a;
    B b;
}

还有很多其他的选择。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4922548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档