[英]need to use custom classes instead of generated (by wsimport) in web-services
[英]Generated web services client classes with no setters
我已经为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 。 但它根本没用。
请问有谁可以告诉我哪种方式可以挖掘? 因为我根本不明白这是怎么回事。 谢谢!
更新JAXB映射的域对象不会导致与服务器的通信。 JAXB(JSR-222)是用于将对象转换为XML或从XML转换对象的标准。 JAX-WS(SOAP)和JAX-RS(RESTful)框架利用它来生成/使用通过线路在客户端和服务器之间发送的消息。
UPDATE
“您对返回列表所做的任何修改都将出现在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
在要作为列表或数组类型公开的元素上使用@XmlElementWrapper。 确保为@XmlElement设置名称,客户端中生成的存根代码不会混淆类名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.