我们正在尝试生成Java SOAP客户端以与外部服务集成。由于这是一家外部公司,因此无法对WSDL进行更改。
当尝试使用cxf-codegen-plugin Maven插件生成客户端时,我们收到以下错误:
Two declarations cause a collision in the ObjectFactory class.
问题与WSDL中的以下声明有关:
<s:element name="CallSomeMethod">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="GetSomeDataResult" type="tns:InterfaceReturnCode" />
<s:element minOccurs="0" maxOccurs="1" name="getSomeDataResult" type="tns:GetSomeDataResult" />
</s:sequence>
</s:complexType>
</s:element>
很明显,问题出在哪里。我的问题是,WSDL似乎被在线通用SOAP客户端导入得很好,所以它必须至少是有效的。我还读到,生成不带-p
选项的Java代码将导致生成器创建单独的包,这应该可以解决问题。但是,我怎么能用cxf-codegen-plugin Maven插件做到这一点?
答案 0 :(得分:0)
不确定是否找到了解决方案,但可能会帮助其他人。 我尝试了以下方法,它对我有用。 我使用cxf-codegen-plugin Maven插件并收到上述错误。 所以首先我在pom.xml中使用了-autoNameResolution。这样可以解决少量重复问题,但仍然很少。 因此,在我的pom.xml中,我使用了“ -p”参数将冲突的名称空间放在单独的目录中,并且可以正常工作。
示例(来自我的pom.xml的片段):
<wsdlOption>
<wsdl>${basedir}/src/main/resources/wsdl/<wsdl_file>.wsdl</wsdl>
<wsdlLocation>http://host.does.not.exist/src/main/resources/wsdl/<wsdl_file>.wsdl</wsdlLocation>
<extraargs>
<extaarg>-client</extaarg>
<extaarg>-verbose</extaarg>
<extraarg>-autoNameResolution</extraarg>
<extraarg>-p</extraarg>
<extraarg><conflicting_namespace>=<package_where_the_namepsace_should_get_created></extraarg>
<extraarg>-p</extraarg>
<extraarg><conflicting_namespace>=<package_where_the_namepsace_should_get_created></extraarg>
</extraargs>
<packagenames>
<packagename><path_to_package></packagename>
</packagenames>
</wsdlOption>