从WSDL生成Java类时Property 'Error'重复定义问题求助
解决WSDL生成Java类时的属性冲突问题
问题场景
我们通过Maven的cxf-codegen-plugin插件从指定WSDL生成Java类,插件配置如下:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>3.5.3</version> <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-bindings-soap</artifactId> <version>3.5.3</version> </dependency> </dependencies> <executions> <execution> <goals> <goal>wsdl2java</goal> </goals> <configuration> <sourceRoot>${project.build.directory}/generated-sources/src</sourceRoot> <wsdlOptions> <wsdlOption> <extraargs> <extraarg>-verbose</extraarg> <extraarg>-autoNameResolution</extraarg> </extraargs> <wsdl>${basedir}/src/main/resources/wsdl/EDROnline.wsdl</wsdl> <wsdlLocation>classpath:wsdl/EDROnline.wsdl</wsdlLocation> <bindingFiles> <bindingFile>${basedir}/src/main/resources/bindings.xml</bindingFile> </bindingFiles> </wsdlOption> </wsdlOptions> </configuration> </execution> </executions> </plugin>
执行mvn clean package构建时,出现两个属性重复错误:
ResultatregnskapOgBalanse.xsd:Property "Aar"已定义,通过绑定文件重命名属性解决Bruktbilverdi.xsd:Property "Error"已定义,但在该xsd中仅找到小写的error元素/属性,尝试绑定重命名后仍报错
当前使用的完整绑定文件:
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <jaxb:bindings schemaLocation="https://ws.infotorg.no/xml/EVRY/InfotorgForetak/2015-12-01/include/ResultatregnskapOgBalanse.xsd" node="/xs:schema"> <jaxb:bindings node="//xs:element[@name='Aar']"> <jaxb:property name="ResultatregnskapOgBalanseAar" /> </jaxb:bindings> </jaxb:bindings> <jaxb:bindings schemaLocation="https://ws.infotorg.no/xml/EurotaxGlass/Bruktbilverdi/2016-03-09/Bruktbilverdi.xsd" node="/xs:schema"> <jaxb:bindings node="//xs:complexType[@name='error']"> <jaxb:property name="BruktbilverdiComplexTypeError" /> </jaxb:bindings> <jaxb:bindings node="//xs:element[@name='error']"> <jaxb:property name="BruktbilverdiElementError" /> </jaxb:bindings> <jaxb:bindings node="//xs:attribute[@name='error']"> <jaxb:property name="BruktbilverdiAttributeError" /> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
解决方案
1. 查看详细日志定位冲突源
插件已配置-verbose参数,执行构建时仔细查看日志,会输出两个冲突属性的具体来源(比如哪个complexType、元素生成了重复的Error属性),这是解决问题的关键。
2. 精准绑定冲突元素
根据日志找到的冲突位置,针对性修改绑定文件,避免泛泛匹配所有error元素。例如,如果冲突来自BruktbilverdiResponse类型下的error元素,绑定配置如下:
<jaxb:bindings schemaLocation="https://ws.infotorg.no/xml/EurotaxGlass/Bruktbilverdi/2016-03-09/Bruktbilverdi.xsd" node="/xs:schema"> <jaxb:bindings node="//xs:complexType[@name='BruktbilverdiResponse']//xs:element[@name='error']"> <jaxb:property name="BruktbilverdiResponseError" /> </jaxb:bindings> </jaxb:bindings>
3. 全局重命名策略(备选)
如果无法定位具体冲突点,可以给该xsd下的所有生成元素/属性添加前缀或后缀,避免全局冲突:
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 给Bruktbilverdi.xsd下的所有生成项加后缀 --> <jaxb:bindings schemaLocation="https://ws.infotorg.no/xml/EurotaxGlass/Bruktbilverdi/2016-03-09/Bruktbilverdi.xsd" node="/xs:schema"> <jaxb:schemaBindings> <jaxb:nameXmlTransform> <jaxb:elementName suffix="Bruktbilverdi"/> <jaxb:attributeName suffix="Bruktbilverdi"/> <jaxb:complexTypeName suffix="Bruktbilverdi"/> </jaxb:nameXmlTransform> </jaxb:schemaBindings> </jaxb:bindings> <!-- 保留已生效的Aar绑定 --> <jaxb:bindings schemaLocation="https://ws.infotorg.no/xml/EVRY/InfotorgForetak/2015-12-01/include/ResultatregnskapOgBalanse.xsd" node="/xs:schema"> <jaxb:bindings node="//xs:element[@name='Aar']"> <jaxb:property name="ResultatregnskapOgBalanseAar" /> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
4. 检查依赖xsd的冲突
确认Bruktbilverdi.xsd是否导入了其他xsd文件,这些导入的xsd中可能存在生成Error属性的元素,需要一并检查并处理。
内容的提问来源于stack exchange,提问作者Naphat Amundsen
相关产品推荐
相关产品推荐

