6

我已经为 SOAP Web 服务创建了一个客户端,但是在生成的代码中,一些类缺少 setter 方法。

对象的 WSDL 如下所示:

<xsd:complexType name="UserDefinedFieldArray">
<xsd:sequence>
<xsd:element name="userDefinedField" minOccurs="0" maxOccurs="unbounded"  
           type="ns0:UserDefinedField"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="UserDefinedField">
<xsd:sequence>
<xsd:element name="fieldName" type="xsd:string"/>
<xsd:element name="fieldValue" type="xsd:string"/>
<xsd:element name="listId" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

这些对象只有 setXXX(),Java Docs 坚持这一点:

“此访问器方法返回对活动列表的引用,而不是快照。因此,您对返回列表所做的任何修改都将出现在 JAXB 对象中。这就是为什么 testSuiteUdfs 属性没有 set 方法的原因。例如,要添加新项目,请执行以下操作: getTestSuiteUdfs().add(newItem); "

虽然我的逻辑告诉我,更新的列表在你发送到服务器之前无法到达服务器?

我设法找到的唯一相关内容:http ://www-01.ibm.com/support/docview.wss?uid=swg21440294 。但这根本没有帮助。

谁能告诉我用什么方法挖?因为我根本不明白这应该如何工作。谢谢!

4

2 回答 2

3

更新由 JAXB 映射的域对象不会导致与服务器的通信。JAXB (JSR-222) 是将对象转换为 XML 的标准。JAX-WS (SOAP) 和 JAX-RS (RESTful) 框架利用它来生成/使用通过客户端和服务器之间的线路发送的消息。

更新

“您对返回列表所做的任何修改都将出现在 JAXB 对象中。”

这意味着List你得到的是真实的List而不是复制品。您可以使用以下代码对此进行测试:

System.out.println(customer.getPhoneNumbers().size());  // returns x
customer.getPhoneNumbers().add(new PhoneNumber());
System.out.println(customer.getPhoneNumbers().size());  // returns x + 1
于 2012-07-26T18:19:39.163 回答
0

在要公开为列表或数组类型的元素上使用 @XmlElementWrapper。确保为@XmlElement 设置名称,客户端中生成的存根代码不会混淆类名。

于 2015-07-22T03:47:54.410 回答