java - 从具有文档/文字格式的 WSDL 生成 Web 服务

标签 java web-services wsdl wsimport

我无法通过 wsimport 从 WSDL 生成 WS。

WSDL是TMDD v3.0标准规范(WSDL和相关的XSD文件可以找到here)

根据 this article from IBM WSDL 似乎是文档/文字格式。

为了编译 WSDL,我创建了一些绑定(bind)/调整,但是我遇到了这个错误(它不会生成方法,因为操作有多个部分):

[WARNING] Ingoring operation "DlFullEventUpdateSubscription": more than one part
 bound to body
  line 17 of file:/O:/temp/wsdltest/TMDD-stripped.wsdl

为了简化,这是 WSDL 的精简版本,只有有趣的操作定义

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:tns="http://www.tmdd.org/3/dialogs"
    xmlns:tmdd="http://www.tmdd.org/3/messages" xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:c2c="http://www.ntcip.org/c2c-message-administration" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    name="TMDDCenterServices" targetNamespace="http://www.tmdd.org/3/dialogs">
    <documentation>
    </documentation>
    <types>

        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:import namespace="http://www.tmdd.org/3/messages"
                schemaLocation="TMDD.xsd" />
            <xs:import namespace="http://www.ntcip.org/c2c-message-administration"
                schemaLocation="C2C.xsd" />
        </xs:schema>
    </types>
    <message name="MSG_EventSubscription">
        <part name="c2cMsgAdmin" element="c2c:c2cMessageSubscription" />
        <part name="message" element="tmdd:eventRequestMsg" />
    </message>
    <!-- Common Messages -->
    <message name="MSG_ConfirmationReceipt">
        <!-- CONNECTION MANAGEMENT Messages -->
        <part name="message" element="c2c:c2cMessageReceipt" />
    </message>
    <message name="MSG_ErrorReport">
        <part name="message" element="tmdd:errorReportMsg" />
    </message>
    <!-- TMDD Owner Center Porttype -->
    <portType name="tmddOCSoapHttpServicePortType">
        <operation name="DlFullEventUpdateSubscription">
            <documentation>
                <objectClass>Event</objectClass>
                <msgPattern>Sub</msgPattern>
                <requirement>REQ1261</requirement>
            </documentation>
            <input message="tns:MSG_EventSubscription" />
            <output message="tns:MSG_ConfirmationReceipt" />
            <fault name="errorReport" message="tns:MSG_ErrorReport" />
        </operation>
    </portType>
    <!-- TMDD Owner Center binding -->
    <binding name="tmddOCSoapHttpServiceBinding" type="tns:tmddOCSoapHttpServicePortType">
        <soap:binding style="document"
            transport="http://schemas.xmlsoap.org/soap/http" />
        <operation name="DlFullEventUpdateSubscription">
            <soap:operation soapAction="' '" style="document" />
            <input>
                <soap:body use="literal" />
            </input>
            <output>
                <soap:body use="literal" />
            </output>
            <fault name="errorReport">
                <soap:fault name="errorReport" use="literal" />
            </fault>
        </operation>
    </binding>
    <!-- TMDD Owner Center Service -->
    <service name="tmddOCSoapHttpService">
        <!-- ************************ -->
        <!-- OWNER CENTER Services -->
        <!-- ************************ -->
        <port name="tmddOCSoapHttpServicePort" binding="tns:tmddOCSoapHttpServiceBinding">
            <soap:address location="http://tmdd.owner.center.com/c2cxml/" />
        </port>
    </service>
</definitions>

绑定(bind)文件:

<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
    <!-- To create standalone classes instead of nested classes -->
    <!--<globalBindings localScoping="toplevel"/>-->

    <!--*****************-->
    <!-- Package Binding -->
    <!--*****************-->

    <!--*****************************-->
    <!-- C2C classes package binding -->
    <!--*****************************-->
    <bindings schemaLocation="C2C.xsd">
        <schemaBindings>
            <package name="tdf.tmdd.model.ntcip.messageadministration" />
        </schemaBindings>
    </bindings>

    <!--**************************************-->
    <!-- ITIS-Adopted classes package binding -->
    <!--**************************************-->
    <bindings schemaLocation="ITIS-Adopted-03-00-02.xsd">
        <schemaBindings>
            <package name="tdf.tmdd.model.itis.adopted" />
        </schemaBindings>       
    </bindings>

    <!--************************************-->
    <!-- ITIS-Local classes package binding -->
    <!--************************************-->
    <bindings schemaLocation="ITIS-Local-03-00-02.xsd">
        <schemaBindings>
            <package name="tdf.tmdd.model.itis.local" />
        </schemaBindings>
    </bindings>

    <!--**************************************-->
    <!-- LRMS-Adopted classes package binding -->
    <!--************************************* -->
    <bindings schemaLocation="LRMS-Adopted-02-00-00.xsd">
        <schemaBindings>
            <package name="tdf.tmdd.model.lrms.adopted" />
        </schemaBindings>                   
    </bindings>

    <!--************************************-->
    <!-- LRMS-Local classes package binding -->
    <!--************************************-->
    <bindings schemaLocation="LRMS-Local-02-00-00.xsd">
        <schemaBindings>
            <package name="tdf.tmdd.model.lrms.local" />
        </schemaBindings>
    </bindings>

    <!--*******************************-->
    <!-- NTCIP classes package binding -->
    <!--*******************************-->
    <bindings schemaLocation="NTCIP-References.xsd">
        <schemaBindings>
            <package name="tdf.tmdd.model.ntcip.objectreferences" />
        </schemaBindings>
    </bindings>

    <!--******************************-->
    <!-- TMDD classes package binding -->
    <!--******************************-->
    <bindings schemaLocation="TMDD.xsd">
        <schemaBindings>
            <package name="tdf.tmdd.model" />
        </schemaBindings>   
    </bindings>

    <!--***********************-->
    <!-- Class personalization -->
    <!--***********************-->

    <!--************************************-->
    <!-- LRMS-Adopted class personalization -->
    <!--************************************-->
    <bindings schemaLocation="LRMS-Adopted-02-00-00.xsd">
        <bindings node="//xs:complexType[@name='Chain']//xs:sequence//xs:element[@name='chain']//xs:complexType">
            <class name="ChainElement" />
        </bindings>   
        <bindings node="//xs:complexType[@name='GridPointPair']">
            <class name="GridPointPairAdopted" />
        </bindings>                 
        <bindings node="//xs:complexType[@name='AreaLocation']">
            <class name="AreaLocationAdopted" />
        </bindings>    
        <bindings node="//xs:complexType[@name='LinkLocation']">
            <class name="LinkLocationAdopted" />
        </bindings>
        <bindings node="//xs:complexType[@name='AdminAreaGroup']">
            <class name="AdminAreaGroupAdopted" />
        </bindings>  
        <bindings node="//xs:complexType[@name='GridPointSequence']">
            <class name="GridPointSequenceAdopted" />
        </bindings>  
        <bindings node="//xs:complexType[@name='Grid']">
            <class name="GridAdopted" />
        </bindings>  
        <bindings node="//xs:complexType[@name='NodeAttribute']">
            <class name="NodeAttributeAdopted" />
        </bindings>  
        <bindings node="//xs:complexType[@name='GridPoint']">
            <class name="GridPointAdopted" />
        </bindings>       
    </bindings>

    <!--********************************-->
    <!-- factory method personalization -->
    <!--********************************-->

    <!--*************************************-->
    <!-- TMDD factory method personalization -->
    <!--*************************************-->
    <bindings schemaLocation="TMDD.xsd" >
        <bindings node="//xs:complexType[@name='IntersectionSignalInventoryLinkList']">
             <factoryMethod name="createIntersectionSignalInventoryLinks" />
         </bindings>
    </bindings>
</bindings>

调用 wsimport 的命令行如下:

O:\temp\wsdltest>wsimport -extension -Xdebug -s src -b bindings.xjb TMDD-stripped.wsdl

如何才能正确创建“DlFullEventUpdateSubscription”操作?是否有任何替代方法来生成 Java Web 服务?我无法修改操作定义,因为那样不符合标准。

更新。解决方案

我设法通过修改 WSDL 使其工作,因此消息的每个部分都分配给 header 和正文:

<binding name="tmddOCSoapHttpServiceBinding" type="tns:tmddOCSoapHttpServicePortType">
    <soap:binding style="document"
        transport="http://schemas.xmlsoap.org/soap/http" />
    <operation name="DlFullEventUpdateSubscription">
        <soap:operation soapAction="' '" style="document" />
        <input>
            <soap:header message="tns:MSG_EventSubscription" use="literal" part="c2cMsgAdmin"/>
            <soap:body use="literal" parts="message"/>
        </input>
        <output>
            <soap:body use="literal" />
        </output>
        <fault name="errorReport">
            <soap:fault name="errorReport" use="literal" />
        </fault>
    </operation>
</binding>

最佳答案

Document-Literal 不能有多部分消息操作。您可以使用以下替代方案。

  • 使用 Document/Literal Wrapped 样式 - 将多个部分包装成一个 文档。
  • 使用 RPC/Literal 风格 - 对绑定(bind)多个没有限制 皂体中的零件。

谢谢, 斯里哈里。

关于java - 从具有文档/文字格式的 WSDL 生成 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10597270/

相关文章:

java - Maven - JSF 2.0 不适用于嵌入式 tomcat

web-services - 测试 SOAP Web 服务时获取 SSLHandshakeException

web-services - 如何通过 Web 服务传输 java.util.Map?

java - 为什么使用此 WSDL 时我的 SOAP 请求始终为空?

java - 针对从 WSDL 中提取的多个模式验证 XML

Java 程序意外终止,没有任何错误消息

java - 如何在多个 Java 线程中使用 COM 服务器

java - 如何创建等于某个值的整数数组?

web-services - Spring Web 服务模板 : Add username token

web-services - 通过 HTTPS 公开 RESTful WCF 服务