使用CXF和wsdl2java生成代码时解决冲突

我在使用wsdl2java通过与Maven的cxf-codegen-plugin的一堆WSDL文件生成代码时遇到了一些冲突。 WSDL声明了同一系统的不同API,并且生成的代码有一些重叠(特别是对于模型类)。 外部系统和WSDL来自第三方,因此不受我们控制。

我遇到的第一个问题是由一个WSDL引起的一个结果ObjectFactory类中的命名冲突。 它定义了一个名为Foo的complexType,它包含一个名为Status的元素,它还定义了一个名为FooStatus的元素。 生成代码时,JAXB会抛出一个拟合,因为ObjectFactory将有两个名为createFooStatus(...)工厂方法,并且在运行时期间最终会出现exception。 我试过向-autoNameResolution提供选项-autoNameResolution但没有用。 我看过“两个声明导致ObjectFactory类中的冲突”和“将外部JAXB绑定文件应用于从WSDL导入的模式元素” ,并基于那些我编写的外部绑定文件重命名其中一个工厂方法。 我在绑定文件中使用SCD而不是XPath,如后一个链接所示,因为我和XPath的问题与作者有同样的问题。 这是有效的,但前提是我单独处理WSDL文件并仅将绑定文件应用于导致冲突的WSDL。 Maven配置如下所示:

  org.apache.cxf cxf-codegen-plugin 3.0.0-milestone1   generate-proxies generate-sources    ${basedir}/First.wsdl  ${basedir}/bindings.xml    ${basedir}/Second.wsdl   ${basedir}/Third.wsdl  ... More wsdlOption declarations ...    wsdl2java     

现在,如果我这样做,我最终会遇到另一个问题,因为来自不同WSDL文件的生成代码使用相同的包结构。 这在实践中意味着在处理后续WSDL文件时会覆盖ObjectFactory类,这意味着在插件执行之后只存在从最后一个WSDL生成的那个。 我知道我可以更改目标包结构,但是从不同的WSDL生成的代码有很多重叠,复制它会感觉很傻。 我也尝试使用-keep wsdl2java选项,但这似乎没有做任何事情(或者至少ObjectFactory类仍然被覆盖)。 我的理解是,对此的解决方案是使用像这样的Maven配置一次性处理所有WSDL(仅显示配置部分,其他所有部分保持不变):

    ${basedir}/bindings.xml   ${basedir}  *.wsdl   

但是,这会导致com.sun.istack.SAXParseException2 ,说我的SCD表达式与任何架构组件都不匹配(因为架构组件仅存在于其中一个WSDL中)。

如果我修改WSDL文件本身并使用后面的Maven配置而没有绑定文件,我可以得到我想要的结果。 通过这样做,生成的ObjectFactory是在使用第一个Maven配置单独处理WSDL时创建的合并。 但是,我宁愿不这样做,而是想用外部绑定文件来管理它。 我该如何解决这个问题? 我是否可以编写/应用绑定文件,以便在找不到匹配的模式组件时不会引发exception? 或者我可以单独处理WSDL而不是覆盖ObjectFactory类吗? 或者,我是否只需要将其从不同的WSDL生成到不同的包或者自己编辑WSDL文件? 万一它很重要,我当前的绑定文件看起来像这样(WSDL位于我的项目内与绑定文件在同一目录中):

      

经过一些谷歌搜索和阅读论坛post后,我最终自己解决了这个问题。 我设法使用XPath(而不是SCD)编写外部绑定文件,其方式仅针对我感兴趣的节点,而不会在处理其他WSDL文件时出错。 最初阻止我使用XPath定位WSDL中的节点的主要混淆源是JAXB和JAXWS命名空间的类似XML模式(都定义了元素’绑定’,我见过的大多数教程都使用了JAXB版本)我不得不使用JAXWS版本)。 生成的绑定文件如下所示: