You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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构建时,出现两个属性重复错误:

  1. ResultatregnskapOgBalanse.xsd:Property "Aar"已定义,通过绑定文件重命名属性解决
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:54:37