1

我创建了一个 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)
4

3 回答 3

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>

修复此问题后,以下生成的 Web 服务在从 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>

消息处理器:

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());
    }
}
于 2013-01-04T19:32:56.720 回答
2

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

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

        <cxf:jaxws-service
            serviceClass="mypackage.webservices.MyServicePortType"
            validationEnabled="false">
        </cxf:jaxws-service>
于 2013-01-04T16:19:30.320 回答
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>

感谢大家的帮助和支持。

于 2013-01-04T19:22:27.433 回答