Please advise on the WSDL

那年仲夏 提交于 2020-01-05 04:29:29

问题


I have created a WSDL to create a greeting service. Given below is the WSDL.

I am using thsi wsdl to create a generate and expose a web-service using the cxf:proxy-service in mule.

This is giving me errors.

Please review and help me undertand what is the problem with this WSDL.

<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions name="HelloService"
    targetNamespace="http://example.org/HelloService"
    xmlns:tns="http://example.org/HelloService" 
    xmlns:ns1="http://schemas.xmlsoap.org/soap/http"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:types>
        <xsd:schema targetNamespace="http://example.org/HelloService" >
              <xsd:element name="LastName">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="lName" type="xsd:string"/>
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="FirstName">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="fName" type="xsd:string"/>
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>

              <xsd:element name="Greeting">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="greet" type="xsd:string"/>
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:schema>
    </wsdl:types>

    <wsdl:message name="shortRequest">
        <wsdl:part type="tns:LastName" name="lastName"/>
      </wsdl:message>

      <wsdl:message name="fullRequest">
        <wsdl:part type="tns:FirstName" name="firstName"/>
        <wsdl:part type="tns:LastName" name="lastName"/>
      </wsdl:message>

      <wsdl:message name="greetingResponse">
        <wsdl:part type="tns:greeting" name="greetings"/>
      </wsdl:message>   


      <wsdl:portType name="HelloServicePortType">

        <wsdl:operation name="simpleGreeting">
          <wsdl:input message="tns:shortRequest" name="shortRequest" />
          <wsdl:output message="tns:greetingResponse" name="greetingResponse" />
        </wsdl:operation>

        <wsdl:operation name="fullGreeting">
          <wsdl:input message="tns:fullRequest" name="fullRequest" />
          <wsdl:output message="tns:greetingResponse"  name="greetingResponseFull" />
        </wsdl:operation>

      </wsdl:portType>


    <wsdl:binding name="HelloServiceSOAP" type="tns:HelloServicePortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

        <wsdl:operation name="simpleGreeting">
          <soap:operation soapAction=""  style="document" />
          <wsdl:input name="shortRequest">
            <soap:body use="literal"/>
          </wsdl:input>
          <wsdl:output name="greetingResponse">
            <soap:body use="literal"/>
          </wsdl:output>
        </wsdl:operation>

       <wsdl:operation name="fullGreeting">
          <soap:operation soapAction=""  style="document" />
          <wsdl:input name="fullRequest">
            <soap:body use="literal"/>
          </wsdl:input>
          <wsdl:output name="greetingResponseFull">
            <soap:body use="literal"/>
          </wsdl:output>
        </wsdl:operation>

      </wsdl:binding>

    <wsdl:service name="ProxyService">
        <wsdl:port binding="tns:HelloServiceSOAP" name="HelloServiceSOAPB">
            <soap:address location="http://localhost:8080/HelloService" />
        </wsdl:port>
    </wsdl:service>     
</wsdl:definitions>

Please help me if there is something wrong in my WSDL. It is not working when I use it in mule cxf:proxy-service.

FGiven below si the Mule Flow which is using this WSDL to expose service.

<flow name="WS_In">
    <http:inbound-endpoint address="http://localhost:8080/HelloService" exchange-pattern="request-response">
        <cxf:proxy-service  wsdlLocation="classpath:globalid3.wsdl" namespace="http://example.org/HelloService" service="ProxyService" />
    </http:inbound-endpoint>        
    <component>             
        <prototype-object class="com.example.ServiceProxy">                                                         
        </prototype-object>
    </component>        
    <echo-component></echo-component>
    <logger level="INFO"        />
</flow>

and the Error is :

org.mule.api.lifecycle.LifecycleException: Lifecycle Manager 'WS_In.stage1' phase 'start' does not support phase 'dispose'
at org.mule.lifecycle.AbstractLifecycleManager.invokePhase(AbstractLifecycleManager.java:156)

回答1:


There is a casing issue in your WSDL. Instead of:

  <wsdl:message name="greetingResponse">
    <wsdl:part type="tns:greeting" name="greetings"/>
  </wsdl:message>  

you should have:

  <wsdl:message name="greetingResponse">
    <wsdl:part type="tns:Greeting" name="greetings"/>
  </wsdl:message>

With this fixed, the following produces a web service that works fine when called from SOAPui:

<flow name="WS_In">
    <http:inbound-endpoint address="http://localhost:8080/HelloService"
        exchange-pattern="request-response">
        <cxf:proxy-service wsdlLocation="classpath:globalid3.wsdl"
            namespace="http://example.org/HelloService" service="ProxyService" />
    </http:inbound-endpoint>
    <custom-processor class="com.example.ServiceProxy" />
</flow>

Message processor:

package com.example;

import javax.xml.namespace.QName;

import org.apache.commons.lang.StringEscapeUtils;
import org.mule.api.MuleEvent;
import org.mule.api.MuleException;
import org.mule.api.processor.MessageProcessor;

public class ServiceProxy implements MessageProcessor
{
    private final static QName SIMPLE_GREETING = new QName("http://example.org/HelloService",
        "simpleGreeting");

    public MuleEvent process(final MuleEvent event) throws MuleException
    {
        final QName operation = event.getFlowVariable("cxf_operation");

        if (operation.equals(SIMPLE_GREETING))
        {
            final String lastName = event.getMuleContext()
                .getExpressionLanguage()
                .evaluate("xpath('/lastName').text", event);

            final String responseXml = "<greetings><greet>Hi " + StringEscapeUtils.escapeXml(lastName)
                                       + "</greet></greetings>";

            event.getMessage().setPayload(responseXml);
            return event;
        }

        throw new UnsupportedOperationException(operation.getLocalPart() + " " + operation.getNamespaceURI()
                                                + " " + operation.getPrefix());
    }
}



回答2:


There is one way to do this using cxf:jaxws-service, but you'll need to generate the service class. Take a look here on how to do this.

After that you can configure the service in a very simple way.

        <cxf:jaxws-service
            serviceClass="mypackage.webservices.MyServicePortType"
            validationEnabled="false">
        </cxf:jaxws-service>



回答3:


The flow that is working is as below.

<flow name="WS_In">
    <http:inbound-endpoint address="http://localhost:8080/HelloService" exchange-pattern="request-response">
            <cxf:proxy-service  wsdlLocation="classpath:helloservice.wsdl" namespace="http://example.org/HelloService" service="ProxyService" />
        </http:inbound-endpoint>        
        <component>             
            <prototype-object class="com.example.ServiceProxy">     
            </prototype-object>
        </component>        
        <echo-component></echo-component>
        <logger level="INFO"        />
 </flow> 

And the WSDL is

<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions name="HelloService"
    targetNamespace="http://example.org/HelloService"
    xmlns:tns="http://example.org/HelloService" 
    xmlns:ns1="http://schemas.xmlsoap.org/soap/http"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

      <wsdl:message name="shortRequest">
        <wsdl:part type="xsd:string" name="lastName"/>
      </wsdl:message>

      <wsdl:message name="fullRequest">
        <wsdl:part type="xsd:string" name="firstName"/>
        <wsdl:part type="xsd:string" name="lastName"/>
      </wsdl:message>

      <wsdl:message name="greetingResponse">
        <wsdl:part type="xsd:string" name="greetings"/>
      </wsdl:message>   


      <wsdl:portType name="HelloServicePortType">

        <wsdl:operation name="simpleGreeting">
          <wsdl:input message="tns:shortRequest" name="shortRequest" />
          <wsdl:output message="tns:greetingResponse" name="greetingResponse" />
        </wsdl:operation>

        <wsdl:operation name="fullGreeting">
          <wsdl:input message="tns:fullRequest" name="fullRequest" />
          <wsdl:output message="tns:greetingResponse"  name="greetingResponseFull" />
        </wsdl:operation>

      </wsdl:portType>


    <wsdl:binding name="HelloServiceSOAP" type="tns:HelloServicePortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

        <wsdl:operation name="simpleGreeting">
          <soap:operation soapAction=""  style="document" />
          <wsdl:input name="shortRequest">
            <soap:body use="literal"/>
          </wsdl:input>
          <wsdl:output name="greetingResponse">
            <soap:body use="literal"/>
          </wsdl:output>
        </wsdl:operation>

       <wsdl:operation name="fullGreeting">
          <soap:operation soapAction=""  style="document" />
          <wsdl:input name="fullRequest">
            <soap:body use="literal"/>
          </wsdl:input>
          <wsdl:output name="greetingResponseFull">
            <soap:body use="literal"/>
          </wsdl:output>
        </wsdl:operation>

      </wsdl:binding>

    <wsdl:service name="ProxyService">
        <wsdl:port binding="tns:HelloServiceSOAP" name="HelloServiceSOAPB">
            <soap:address location="http://localhost:8080/HelloService" />
        </wsdl:port>
    </wsdl:service>

</wsdl:definitions>

Thanks everyone for your help and support.



来源:https://stackoverflow.com/questions/14160164/please-advise-on-the-wsdl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!