请告知WSDL

时间:2013-01-04 15:39:08

标签: web-services proxy wsdl cxf mule

我创建了一个WSDL来创建一个问候语服务。下面给出的是WSDL。

我正在使用thsi wsdl创建一个生成并使用mule中的cxf:proxy-service公开Web服务。

这给了我错误。

请查看并帮助我解决此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>

如果我的WSDL出现问题,请帮助我。 当我在mule cxf:proxy-service中使用它时,它无法正常工作。

FGiven下面是使用此WSDL公开服务的Mule Flow。

<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>

,错误是:

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)

3 个答案:

答案 0 :(得分:3)

您的WSDL中存在一个外壳问题。而不是:

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

你应该:

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

通过这个修复,以下产生了一个从SOAPui调用时工作正常的Web服务:

<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>

消息处理器:

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());
    }
}

答案 1 :(得分:2)

有一种方法可以使用cxf:jaxws-service来完成此操作,但您需要生成服务类。看看here如何做到这一点。

之后,您可以以非常简单的方式配置服务。

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

答案 2 :(得分:0)

正在运行的流程如下。

<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> 

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: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>

感谢大家的帮助和支持。