XFIRE框架去掉自动生成的nillable属性

最近,我们的项目有个融合需求,合作方需要我们根据其客户端规范提供相应的SOAP服务,对方提供了文档,并且提供了相应的wsdl文件。

我们用xfire框架根据文档中的描述做好了demo,然后使用它们提供的wsdl文件生成了客户端的代码,再进行测试,结果发现,客户端代码可以调用程序,却不能将参数正确地传递到服务端。

开始分析对比两份wsdl文件。一开始以为是namespace的原因,配置好了以后还是不行。后来比对了两份wsdl文件生成的客户端代码,发现对方提供的wsdl文件生成的客户端代码是使用的请求对象的属性使用的是原始对象,如String等,而我们生成的客户端代码,几乎都是JAXBElement类定义的属性。上网查了下资料,发现是因为 nillable 这个属性造成的。

找到原因后,开始查怎样才能把 nillable 这个属性去掉。找了很多资料都说XFire框架没办法控制这个 nillable 这个属性,建议换成JAXB,后来不断地折腾,一会儿是用axis2,一会儿是XFIRE+JAXB,可以把nillable这个属性值去掉,但又会引起其他一些乱七八糟的问题。

在我都要放弃的时候,忽然想说,把这个nillable放到aegis配置文件中,看看有啥作用。结果nillable这个属性去掉了,但是生成出来的wsdl文件中丢掉了minOccurs这个属性,既然可以在aegis文件配置nillable属性,minOccurs这个应该也可以起作用,测试了下后是可以使用的。至此,问题总算解决了。


注:maxOccurs这个属性貌似不起作用。

配置文件信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:s="http://yournamespace.com/">
	<mapping name="s:RequestName">
		<property name="code" mappedName="Code" minOccurs="0" componentType="java.lang.String" />
	</mapping>
</mappings>


生成的WSDL文件内容为:

<xsd:complexType name="RequestName">
 <xsd:sequence>
  <xsd:element minOccurs="0" name="Code" type="xsd:string" /> 
 </xsd:sequence>
</xsd:complexType>


参考资料:

http://www.blogjava.net/wufalong/articles/209901.html
http://hi.baidu.com/hero8_8_8/item/413e16fb75f70a1ba62988d8

你可能感兴趣的:(xfire,nillable)