如何解决 wsdl2java 上的 ObjectFactory 中的冲突?

Posted

技术标签:

【中文标题】如何解决 wsdl2java 上的 ObjectFactory 中的冲突?【英文标题】:How to resolve collision in the ObjectFactory on wsdl2java? 【发布时间】:2014-11-16 13:20:02 【问题描述】:

我正在使用CXFwsdl2java 来自动生成网络服务类。

问题:不知何故,我想连接的网络服务有一些元素的重复名称:

Two declarations cause a collision in the ObjectFactory class

xsd 是这样的:

<xs:schema targetNamespace="http://thenamespace">
    <xs:complexType name="ViolatingName">
     ...
    </xs:complexType>
    <xs:element name="ViolatingName" nillable="true" type="tns:ViolatingName"/>
</xs:schema>

xsd 本身被导入到用于自动生成 jaxb 类的 wsdl 中,如下所示:

<wsdl:types>
    <xsd:schema targetNamespace="http://imports">
        <xsd:import schemaLocation="https://path.to.xsd" namespace="http://thenamespace" />

我正在尝试使用jaxb-bindings.xml

<jaxb:bindings    
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    jaxb:extensionBindingPrefixes="xjc"   
    jaxb:version="2.1">

    <jaxb:bindings schemalocation="https://path.to.xsd" node="//xs:schema">
    <jaxb:bindings node=".//xs:element[@name='ViolatingName']">
            <jaxb:property name="ViolatingNameBinding" />
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

结果:

[ERROR] XPath evaluation of "//xs:schema" results in empty target node (org.apache.cxf:cxf-codegen-plugin:3.0.1:wsdl2java:generate-sources:generate-sources)

为什么node 在这里错了? xsd 有一个xs:schema 标签,那为什么会失败呢?

有趣的事实:当我使用任何 xpath 工具时,将 XSD 下载到我的本地计算机并检查路径,然后 //xs:schema/xs:element[@name='ViolatingName'] 评估为正确的标记。

【问题讨论】:

在标签绑定的 xs:schema 上缺少双 '//'.. 我在上面也做了调整,但结果是一样的... 【参考方案1】:

事实证明,我必须对所有 xs:complexType 元素应用重命名/后缀,如下所示:

<jaxb:bindings schemaLocation="https://path.to.xsd" node="/xs:schema">
    <jaxb:schemaBindings>
        <jaxb:nameXmlTransform>
            <jaxb:typeName suffix="Type" />
        </jaxb:nameXmlTransform>
    </jaxb:schemaBindings>
</jaxb:bindings>

【讨论】:

【参考方案2】:

尝试jaxb:factoryMethod 而不是jaxb:property

<jaxb:bindings node=".//xs:element[@name='ViolatingName']">
    <jaxb:factoryMethod name="ViolatingName1" />
</jaxb:bindings>

使用jaxb:factoryMethod 的example of binding。

更新:

This 可能也会有所帮助。

【讨论】:

哪一个?您已经列出了两个 - 一个带有碰撞,一个带有空目标节点。 对不起,我输入了空的目标节点。没有显示共谋,因为 wsdl2java 根本没有达到可能发生此异常的地步。, 请查看更新。我猜你正在编译一个 WSDL,所以 wsdl2java 可能需要一些特殊的带有绑定的 mumbo-jumbo。请看最后一个链接:***.com/questions/22425306/…【参考方案3】:

属性绑定声明

绑定声明使您能够自定义 XML 模式元素与其 Java 表示的绑定作为属性。自定义范围可以在定义级别或组件级别,具体取决于指定绑定声明的位置。

自定义的语法是:

<property      [ name = "propertyName"]
  [ collectionType = "propertyCollectionType" ]
  [ fixedAttributeAsConstantProperty = "true" | "false" | "1" | "0" ]
  [ generateIsSetMethod = "true" | "false" | "1" | "0" ]
  [ enableFailFastCheck ="true" | "false" | "1" | "0" ]
  [ <baseType> ... </baseType> ]
  [ <javadoc> ... </javadoc> ]
</property>

<baseType>
  <javaType> ... </javaType>
</baseType> 
name定义自定义值propertyName;它必须是合法的 Java 标识符。 collectionType 定义自定义值propertyCollectionType,它是属性的集合类型。 propertyCollectionType(如果指定)可以是索引或任何实现 java.util.List 的完全限定类名。 fixedAttributeAsConstantProperty 定义自定义值 fixedAttributeAsConstantProperty。该值可以是 true、false、1 或 0。 generateIsSetMethod 定义了 generateIsSetMethod 的自定义值。该值可以是 true、false、1 或 0。 enableFailFastCheck 定义自定义值 enableFailFastCheck。该值可以是 true、false、1 或 0。请注意,JAXB 实现不支持故障快速验证。 &lt;javadoc&gt; 为属性的 getter 方法自定义 Javadoc 工具注解。

来自link

XSD

<xs:schema targetNamespace="http://thenamespace">
    <xs:element name="ViolatingName" type="tns:ViolatingName"/> 
    <xs:complexType name="ViolatingName">
        <xs:all>
            <xs:element name="prova" type="xs:string"/>
        </xs:all>
    </xs:complexType>

    <xs:element name="AdditionalInfos" type="AdditionalInfos"/>
    <xs:complexType name="AdditionalInfos">
        <xs:sequence>
            <xs:element minOccurs="1" name="ViolatingName" type="tns:ViolatingName"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

绑定

<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:annox="http://annox.dev.java.net"
    xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix">
    <bindings schemaLocation="../path/of/your.xsd">

            <bindings node="//xs:complexType[@name='AdditionalInfos']//xs:sequence//xs:element[@name='ViolatingName']">
                <property name="aaa" />
            </bindings>

    </bindings>
</bindings>

生成的类

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AdditionalInfos", propOrder = 
    "aaa",
)
@XmlRootElement
public class AdditionalInfos
    implements Serializable


    private final static long serialVersionUID = 12343L;
    @XmlElement(name = "ViolatingName", required = true)
    protected ViolatingName aaa;

【讨论】:

以上是关于如何解决 wsdl2java 上的 ObjectFactory 中的冲突?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apache Axis2 和 WSDL2Java 向 SOAP 响应添加命名空间引用

Scala 相当于 wsdl2java?

将 ws-security 添加到 wsdl2java 生成的类

WSDL2Java抛出无法找到主类:org.apache.axis.wsdl.WSDL2Java

向 wsdl2java 生成的代码添加soap头认证

apache cxf wsdl2java命令