有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JAXB自定义绑定前缀必须解析为命名空间

我试图使用maven-jaxb2-plugin从WSDL生成java类,但没有成功。WSDL包含一个名为stringArray的complextype的两个定义,所以我试图创建一个自定义绑定,这样两个类在创建时不会冲突。问题是我一直都会遇到这样的错误:

XPath: javax.xml.transform.TransformerException: Prefix must resolve to a namespace: wsdl

我的Maven Maven-jaxb2-plugin插件配置如下:

<plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.14.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <schemaLanguage>WSDL</schemaLanguage>
                    <generateDirectory>${project.basedir}/src/main/java</generateDirectory>
                    <generatePackage>com.arkdia.seus.service.stamping.xml.invoice.cancel.implementation.finkok</generatePackage>
                    <schemas>
                        <schema>
                            <url>https://demo-facturacion.finkok.com/servicios/soap/cancel.wsdl</url>
                        </schema>
                    </schemas>
                    <bindingDirectory>${project.basedir}/src/main/resources/finkok/bindings</bindingDirectory>
                    <bindingIncludes>
                        <include>bind.xjb</include>
                    </bindingIncludes>
                </configuration>
            </plugin>

我的束缚。xjb具有以下特点:

<jaxb:bindings version="1.0"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    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:bindings
        node="/wsdl:definitions[@targetNamespace='http://facturacion.finkok.com/cancel']/wsdl:types/xs:schema[@targetNamespace='http://facturacion.finkok.com/cancellation']">
        <jaxb:bindings
            node="/xs:complexType[@name='stringArray']">
            <jaxb:factoryMethod name="CancelStringArray" />
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

我用这个online tool测试了XPath,它似乎是正确的,但是当我用Maven编译mi代码时,我得到了前面提到的错误

我做错了什么

编辑:

WSDL定义为here

多亏了@LMC,我注意到一个名称空间丢失了。xjb添加了它,但现在我得到了这个错误:

xpath evaluation of results in empty target node

编辑2:

根据@LMC的建议,我更新了绑定。xjb文件,以包括架构位置。但现在,即使我为conflictind复杂类型定义了一个新的类名,我还是会遇到以下错误:

two declarations cause a collision in the ObjectFactory class

我的新绑定。xjb看起来像这样

<jaxb:bindings version="1.0"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    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:bindings
        schemaLocation="https://demo-facturacion.finkok.com/servicios/soap/cancel.wsdl"
        node="/wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://facturacion.finkok.com/cancellation']/xs:complexType[@name='stringArray']">
        <jaxb:class name="CancellationStringArray" />
    </jaxb:bindings>
    <jaxb:bindings
        schemaLocation="https://demo-facturacion.finkok.com/servicios/soap/cancel.wsdl"
        node="/wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://facturacion.finkok.com/cancel']/xs:complexType[@name='stringArray']">
        <jaxb:class name="CancelStringArray" />
    </jaxb:bindings>
</jaxb:bindings>

共 (1) 个答案

  1. # 1 楼答案

    最后一个问题是因为有第三个元素具有相同的名称,所以最终绑定。xjb就是这样

    <jaxb:bindings version="1.0"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        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:bindings
            schemaLocation="https://demo-facturacion.finkok.com/servicios/soap/cancel.wsdl"
            node="/wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://facturacion.finkok.com/cancellation']/xs:complexType[@name='stringArray']">
            <jaxb:class name="CancellationStringArray" />
        </jaxb:bindings>
        <jaxb:bindings
            schemaLocation="https://demo-facturacion.finkok.com/servicios/soap/cancel.wsdl"
            node="/wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://facturacion.finkok.com/cancellation']/xs:element[@name='stringArray']">
            <jaxb:class name="CancellationStringArrayElement" />
        </jaxb:bindings>
    </jaxb:bindings>
    

    感谢@LMC帮助识别jaxb:bindings中缺少的名称空间声明和schemaLocation