为什么wsimport的具有由具有@XmlRootElement注释服务器对象的麻烦?(Why do

2019-08-05 12:27发布

我是在服务器端使用JAX-WS Web服务完成的工作。 在众多的领域对象的我用@XmlRootElement以帮助促进的XML文件解组到JAXB使用该服务。 一切顺利的话,输出是我希望看到使用了SoapUI。

然而,当我使用的wsimport创建客户端(如便利DAO对其他开发人员),我开始在我的客户端集成,测试类遇到NullPointerException异常。

到Web服务调用工作正常,并响应客户端所接收到的,但我更复杂的对象是零。 简单的属性,如弦乐,正在返回全可利用的数据,而不是更大的物体。

通过运用简单的字符串重新创建服务,并迁移到更复杂的对象迭代,我发现,当客户端收到被宣布为与服务器上的对象@XmlRootElement ,这些是都是空的对象。 如果服务器对象没有足够的@XmlRootElement注释,客户端收到的所有数据在其所有复杂的辉煌。

最初缺乏@XmlRootElement给了我解编服务器上的数据拟合,但这个答案让我出去。

因此,客户端的wsimport默默地失败的,因为的Web服务响应的拆封现象@XmlRootElement注释(在服务器上!)有我关心的。 在这种情况下,我有双方的控制,并可以做一些事情。 但是,如果我没有服务器的控制权? 如何将我曾经使用过的的wsimport生成的代码解决了这个?

Answer 1:

找到了答案,或原因,所以以为我也有同感。

@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工作就好了。

如何使用@XmlRootElementJAX-WS服务?

wsimport似乎来处理由服务返回的XML的有效性,一定程度上的懒惰。 吸取的教训是要在你使用的勤奋nametargetNamespace在您@WebResult描述Web服务方法的注释。 该@XmlRootElement注释需要匹配name的范围内targetNamespace 。 当他们所有的比赛,该解组发生的预期。 当这些值不匹配,所产生的并注明您的存根类wsimport将不能正确地使用XML。



文章来源: Why does wsimport have trouble with server object having @XmlRootElement annotation?