我正在使用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生成的代码吗?
答案 0 :(得分:0)
您可以使用jaxb:class/@ref
定制来强制JAXB / XJC重用现有的类。大致情况:
<jaxb:class ref="com.acme.foo.Apple"/>
其中com.acme.foo.Apple
是所生成的Apple
类之一的FQCN。
将其绑定到其他两个xs:complexType
上,JAXB将重用现有的类,而不是再次生成相同的东西。
我在定制WSDL方面没有太多经验,因此不幸的是,在这种情况下,我无法为您指出绑定的确切语法。