我是在服务器端使用JAX-WS Web服务完成的工作。 在众多的领域对象的我用@XmlRootElement
以帮助促进的XML文件解组到JAXB使用该服务。 一切顺利的话,输出是我希望看到使用了SoapUI。
然而,当我使用的wsimport创建客户端(如便利DAO对其他开发人员),我开始在我的客户端集成,测试类遇到NullPointerException异常。
到Web服务调用工作正常,并响应客户端所接收到的,但我更复杂的对象是零。 简单的属性,如弦乐,正在返回全可利用的数据,而不是更大的物体。
通过运用简单的字符串重新创建服务,并迁移到更复杂的对象迭代,我发现,当客户端收到被宣布为与服务器上的对象@XmlRootElement
,这些是都是空的对象。 如果服务器对象没有足够的@XmlRootElement
注释,客户端收到的所有数据在其所有复杂的辉煌。
最初缺乏@XmlRootElement
给了我解编服务器上的数据拟合,但这个答案让我出去。
因此,客户端的wsimport默默地失败的,因为的Web服务响应的拆封现象@XmlRootElement
注释(在服务器上!)有我关心的。 在这种情况下,我有双方的控制,并可以做一些事情。 但是,如果我没有服务器的控制权? 如何将我曾经使用过的的wsimport生成的代码解决了这个?
找到了答案,或原因,所以以为我也有同感。
的@XmlRootElement
注释是用于普通有用JAXB
绑定,但是当对象(和所得到的XML)被打包为一个SOAP
响应可能的是,它们不完全匹配的WSDL
取决于值的数据的的表示其他注释。
与@XmlRootElement
正在其上由一个返回的服务器上的类注释@WebMethod
方法,所述WSDL
将包括一个元素定义如:
<xs:element name="foo" type="tns:FooType"/>
然后别处您的WSDL
将包括在一个序列中,例如元素的引用:
<xs:seqeunce>
<xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:foo"/>
</xs:sequence>
此参考由引起@XmlRootElement
注释可能混淆相比SOAP响应的实际XML根元素声明的意图。
与此相反, WSDL
而不产生@XmlRootElement
上的服务器对象注释不包含<xs:element name="foo"/>
声明的。 更确切地说,它元件被描述为:
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="foo" type="tns:FooType"/>
</xs:sequence>
这可能是更好的匹配SOAP响应XML的表示方式和XML转换所产生的类的解组wsimport
工作就好了。
如何使用@XmlRootElement
在JAX-WS
服务?
wsimport
似乎来处理由服务返回的XML的有效性,一定程度上的懒惰。 吸取的教训是要在你使用的勤奋name
和targetNamespace
在您@WebResult
描述Web服务方法的注释。 该@XmlRootElement
注释需要匹配name
的范围内targetNamespace
。 当他们所有的比赛,该解组发生的预期。 当这些值不匹配,所产生的并注明您的存根类wsimport
将不能正确地使用XML。
文章来源: Why does wsimport have trouble with server object having @XmlRootElement annotation?