从WSDL转换为Java时,解决类名冲突

时间:2019-01-18 16:57:04

标签: data-binding wsdl cxf-codegen-plugin

我正在使用CXF将WSDL转换为Java。启用-autoNameResolution键后,CXF会生成许多具有相同内容的文件。有什么办法可以避免吗?

为避免嵌套静态类,我启用了<jaxb:globalBindings localScoping="toplevel">。正如您在WSDL元素中看到的,“ Apple”被引用了3次。不幸的是,我无法更改WSDL。 CXF创建 Apple.java,Apple2.java,Apple3.java 相应地发生,或者在未设置-autoNameResolution标志时崩溃。

<xs:element name="Forest">
  <xs:complexType>
    <xs:sequence>
      <xs:element maxOccurs="99" minOccurs="0" name="Apple">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Size" type="xsd:string" />
            <xs:element name="Color" type="xsd:string" />
            <xs:element name="Taste" type="xsd:string" />
          </xs:sequence>
        </xs:complexType>

      </xs:element>
      <xs:element minOccurs="0" name="TreeOne">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Branch1" type="xsd:string">
            </xs:element>
            <xs:element maxOccurs="99" minOccurs="0" name="Apple">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Size" type="xsd:string" />
                  <xs:element name="Color" type="xsd:string" />
                  <xs:element name="Taste" type="xsd:string" />
                </xs:sequence>

              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element minOccurs="0" name="TreeTwo">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="BranchTwo" type="xsd:string">
            </xs:element>
            <xs:element maxOccurs="99" minOccurs="0" name="Apple">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Size" type="xsd:string" />
                  <xs:element name="Color" type="xsd:string" />
                  <xs:element name="Taste" type="xsd:string" />
                </xs:sequence>

              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

有什么方法可以教导 wsdl2java ,不要在所有这三种情况下都创建 Apple2.java 和Apple3.java并引用Apple.java?通过绑定,我可以将名称更改为其他名称,例如 Apple2->桃子 Apple3->西瓜,但这不是我想要的。显而易见,所有三个苹果都具有相同的字段集,并且实际上是相同的吗? 有什么办法解决吗?可能是一些重构插件可以重构cxf生成的代码吗?

1 个答案:

答案 0 :(得分:0)

您可以使用jaxb:class/@ref定制来​​强制JAXB / XJC重用现有的类。大致情况:

<jaxb:class ref="com.acme.foo.Apple"/>

其中com.acme.foo.Apple是所生成的Apple类之一的FQCN。 将其绑定到其他两个xs:complexType上,JAXB将重用现有的类,而不是再次生成相同的东西。

我在定制WSDL方面没有太多经验,因此不幸的是,在这种情况下,我无法为您指出绑定的确切语法。