gpt4 book ai didi

java - 在 Java 中使用 Contract-First 的 Web 服务周期

转载 作者:搜寻专家 更新时间:2023-11-01 03:13:32 26 4
gpt4 key购买 nike

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

为了能够处理周期,我应该如何编写 WSDL/XSD 文件?例如对象 department 引用 employeesemployee 引用 department(如本文 http://jaxb.java.net/guide/Mapping_cyclic_references_to_XML.html ).这篇文章提到了一个 @XmlTransient 注释,但由于我使用契约优先,所以我无法以任何方式修改生成的类。

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

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

最佳答案

问题是网络服务契约(Contract)(至少是符合 WS-I 基本配置文件的契约(Contract))不能对消息中其他对象的引用进行编码。也就是说,引用类型的字段总是通过编码它所引用的对象的字段来编码。如果对象图包含循环,则此递归是无限的。

也就是说,如果你有:

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;
}

以及许多其他选项。

关于java - 在 Java 中使用 Contract-First 的 Web 服务周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4922548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com