使用带有wsimport的JAXB剧集文件

时间:2014-08-13 09:37:49

标签: jaxb xsd wsdl jax-ws wsimport

有两个WSDL共享一些用于定义其数据类型的模式。以下是其中一个WSDL的示例:

<wsdl:definitions
    name="FooService"
    targetNamespace="http://xmlns.my.org/services/FooService/v001"
    xmlns:srv="http://xmlns.my.org/services/FooService/v001"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:fault="java:org.my.exception"
    ...
>
    <wsdl:types>
        <xsd:schema>
            <xsd:import namespace="java:org.my.exception" schemaLocation="../xsd/common/BusinessException.xsd"/>
            <xsd:import namespace="http://xmlns.my.org/services/FooServiceMessages/v001" schemaLocation="../xsd/fooservice/FooServiceMessages_v001.xsd"/>
        </xsd:schema>
    </wsdl:types>
    ...
    <wsdl:message name="BusinessException">
        <wsdl:part element="fault:BusinessException" name="BusinessException"/>
    </wsdl:message>
    ...
    <wsdl:portType name="IFooService">
        <wsdl:operation name="getItems">
            ...
            <wsdl:fault message="srv:BusinessException" name="BusinessException"/>
        </wsdl:operation>
        ...
    </wsdl:portType>
    ...
</wsdl:definitions>

BusinessException.xsd是常见方案之一。

我试图通过这些带有wsimport的WSDL生成Java代码。从WSDLd中单独编译公共模式然后在编译WSDL时重用从这些模式派生的类是合理的。为此,我生成了一个JAXB剧集文件以及常见的Java代码:

<bindings version="2.1" xmlns="http://java.sun.com/xml/ns/jaxb">
  <bindings scd="x-schema::tns" xmlns:tns="java:org.my.exception">
    <schemaBindings map="false">
      <package name="org.my.integration.dto.common"/>
    </schemaBindings>
    <bindings scd="~tns:BusinessException">
      <class ref="org.my.integration.dto.common.BusinessException"/>
    </bindings>
  </bindings>
  <bindings scd="x-schema::tns" xmlns:tns="http://xmlns.my.org/BaseIdentifiers/v001">
    <schemaBindings map="false">
      <package name="org.my.integration.dto.common"/>
    </schemaBindings>
    <bindings scd="~tns:EntityIdentifierListType">
      <class ref="org.my.integration.dto.common.EntityIdentifierListType"/>
    </bindings>
    <bindings scd="~tns:...">
      <class ref="..."/>
    </bindings>
    ...
  </bindings>
</bindings>

http://xmlns.my.org/BaseIdentifiers/v001命名空间中填充了另一个在FooServiceMessages_v001.xsd中导入的常见架构(实际上是在架构中导入的架构中...&... #39; s导入FooServiceMessages_v001.xsd)。

这是一个用于生成Java代码的wsimport调用:

wsimport -B-XautoNameResolution -Xnocompile -s ./../java/ -verbose -b ./bindings/fooservice/jaxws-bindings.xml -b ./bindings/fooservice/jaxb-bindings.xml -b ./bindings/common/common.episode -keep ./wsdl/FooService_v001.wsdl

此次通话时出现以下错误:

[ERROR] Schema descriptor {java:org.my.exception}BusinessException in message part "BusinessException" is not defined and could not be bound to Java. ...

BTW如果在普通外部JAXB绑定文件(不在剧集文件中)中描述BusinessException.xsd的绑定,则一切正常。看起来wsimport在处理剧集文件方面存在一些问题,这些剧集文件描述了直接在WSDL中导入的方案的绑定。

对于直接在WSDL中导入的方案,有没有办法使用带有wsimport的剧集文件(比如我的BusinessException.xsd)?

2 个答案:

答案 0 :(得分:0)

这似乎是某种错误或wsimport的错误行为。 Apache CXF的wsdl2java工具缺少这个问题。

答案 1 :(得分:0)

https://github.com/javaee/jaxb-v2/issues/514说过,不可能使用JAXB情节为WSDL生成源。

Sun / Oracle工程师无法在11年内(2008-2019年)实施必要的增强功能。最近,Oracle向Eclipse项目提供了源代码(2018年10月)。

我生成没有情节的WSDL绑定,最后一步是从通用模式中删除软件包。对于Gradle,它看起来像:

wsimport {
    wsdl = file("${project.rootDir}/wsdl/PingService.wsdl")
    bindings = files(...)
}
task('afterWsimport', type: Delete) {
    delete new File(file(wsimport.javaDir), "com/bla/schema")
    delete new File(file(wsimport.javaDir), "com/foo")
}
wsimport.finalizedBy(afterWsimport)