2

我正在使用 Maven JAXWS 插件和 bindings.xml 文件来覆盖从 WSDL 生成的 JAXB 类字段的 Java 类型,但是在使用 JAX-WS Maven 插件从多个 WSDL 生成 Java 类时遇到问题。

我的项目结构是:

- src
  - jaxws
    - bindings.xml
  - main
    - resources
      - wsdl
        - Wsdl1.wsdl
        - Wsdl1.xsd
        - Wsdl2.wsdl
        - Wsdl2.xsd

Wsdl1.wsdlreferences Wsdl1.xsdWsdl2.wsdlreferences Wsdl2.xsd,这两个 WSDL 和 XSD 没有任何共同之处。我无法修改 WSDL 和 XSD。

departureDate我想在特定类型 ( Flight) 中覆盖特定字段 () 的 Java 类型Wsdl2.xsd

bindings.xml的是

<bindings version="2.0" extensionBindingPrefixes="xjc"
               xmlns="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">
    <globalBindings>
        <xjc:javaType name="org.joda.time.LocalDate" xmlType="xs:date"
                      adapter="my.LocalDateAdapter"/>
        <xjc:javaType name="org.joda.time.DateTime" xmlType="xs:dateTime"
                      adapter="my.DateTimeAdapter"/>
    </globalBindings>
    <bindings schemaLocation="../main/resources/wsdl/Wsdl2.xsd" node="/xs:schema">
        <bindings node="//xs:complexType[@name='Flight']//xs:element[@name='departureDate']">
            <xjc:javaType name="org.joda.time.LocalDateTime"
                          adapter="my.LocalDateTimeAdapter"/>
        </bindings>
    </bindings>
</bindings>

我的 Maven 配置是

<plugin>
    <groupId>org.jvnet.jax-ws-commons</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <wsdlDirectory>${basedir}/src/main/resources/wsdl</wsdlDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

当我使用该配置构建模块时,JAX-WS 会一一处理 WSDL,但bindings.xml对它们中的每一个都使用相同的。这样,Wsdl1由于对Wsdl2.xsdin的引用,它在处理过程中失败bindings.xml

[INFO] --- jaxws-maven-plugin:2.2:wsimport (default) @ my-backend ---
[INFO] Processing: file:/D:/dev/Projects/my-api/my-backend/src/main/resources/wsdl/Wsdl1.wsdl
[INFO] jaxws:wsimport args: [-keep, -s, D:\dev\Projects\my-api\my-backend\target\generated-sources\wsimport, -encoding, UTF-8, -Xnocompile, -b, D:\dev\Projects\my-api\my-backend\src\jaxws\bindings.xml, file:/D:/dev/Projects/my-api/my-backend/src/main/resources/wsdl/Wsdl1.wsdl]
parsing WSDL...

[ERROR] "file:/D:/dev/Projects/my-api/my-backend/src/main/resources/wsdl/Wsdl2.xsd"
 is not a part of this compilation. Is this a mistake for "file:/D:/dev/Projects/my-api/my-backend/src/main/resources/wsdl/Wsdl1.wsdl#types?schema1"?
  line 11 of file:/D:/dev/Projects/my-api/my-backend/src/jaxws/bindings.xml

如果我选择仅Wsdl2.wsdl由 JAX-WS 插件处理,那么一切正常。

<configuration>
    <wsdlDirectory>${basedir}/src/main/resources/wsdl</wsdlDirectory>
    <wsdlFiles>
        <wsdlFile>Wsdl2.wsdl</wsdlFile>
    </wsdlFiles>
</configuration>

我该如何解决这个问题?

4

1 回答 1

3

为除 Wsdl2.wsdl 之外的所有 WSDL 创建一个 wsimport 执行,并为 Wsdl2.wsdl 创建另一个执行。这样,您可以为每次执行设置不同的配置,并为每个执行指定不同的 jaxb 绑定。

于 2015-09-04T15:27:21.887 回答