【问题标题】:Axis2 WebService Client: The given SOAPAction does not match an operationAxis2 WebService 客户端:给定的 SOAPAction 与操作不匹配
【发布时间】:2015-02-11 05:11:13
【问题描述】:

我有一个使用 CXF 在我的计算机上运行的测试 web 服务,我一直在尝试使用 Apache Axis2 的“wsdl2java”功能制作客户端。我已经生成了代码,但出现以下错误:

org.apache.axis2.AxisFault: The given SOAPAction http://service.taller1.webservices.spring.com/HolaMundoService/saludaHola does not match an operation.
at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:531)
at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:375)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at com.spring.webservices.taller1.service.impl.HolaMundoServiceImplServiceStub.saludaHola(HolaMundoServiceImplServiceStub.java:182)
at mian.Main.main(Main.java:27)

这里是wsdl:

<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.service.taller1.webservices.spring.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://service.taller1.webservices.spring.com/" name="HolaMundoServiceImplService" targetNamespace="http://impl.service.taller1.webservices.spring.com/">
  <wsdl:import location="http://localhost:8080/webservice-cfx-spring-0.0.1-SNAPSHOT/HolaMundoService?wsdl=HolaMundoService.wsdl" namespace="http://service.taller1.webservices.spring.com/">
    </wsdl:import>
  <wsdl:binding name="HolaMundoServiceImplServiceSoapBinding" type="ns1:HolaMundoService">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="saludaHola">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="saludaHola">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="saludaHolaResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="HolaMundoServiceImplService">
    <wsdl:port binding="tns:HolaMundoServiceImplServiceSoapBinding" name="HolaMundoServiceImplPort">
      <soap:address location="http://localhost:8080/webservice-cfx-spring-0.0.1-SNAPSHOT/HolaMundoService"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

如果有任何帮助,我将不胜感激。提前感谢您的帮助!

【问题讨论】:

    标签: soap axis2 webservice-client


    【解决方案1】:

    您可能使用了错误的操作或错误的架构绑定。

    以下内容可能对您有用:

        ServiceClient client = new ServiceClient();
        OperationClient operationClient = client.createClient(ServiceClient.ANON_OUT_IN_OP);
    
        // creating message context
        MessageContext outMsgCtx = new MessageContext();
        // assigning message context’s option object into instance variable
        Options opts = outMsgCtx.getOptions();
        // setting properties into option
        opts.setTo(new EndpointReference("http://localhost:8080/webservice-cfx-spring-0.0.1-SNAPSHOT/HolaMundoService"));
        opts.setAction(""); //your soap action is null
        HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();
        auth.setUsername("user");
        auth.setPassword("pass");
        opts.setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, auth);
        //Create the Soap Factory
        SOAPFactory fac = OMAbstractFactory.getSOAP11Factory();
        //Create the request envelope
        SOAPEnvelope envelope = fac.getDefaultEnvelope();
        OMNamespace globalNs = fac.createOMNamespace("http://service.taller1.webservices.spring.com/", "ns1");
        // creating the payload
        OMElement method = fac.createOMElement("saludaHola", globalNs);
        method.setText("Hello");
        envelope.getBody().addChild(method);
        outMsgCtx.setEnvelope(envelope);
        operationClient.addMessageContext(outMsgCtx);
        operationClient.execute(true);
        MessageContext inMsgtCtx = operationClient.getMessageContext("In");
        //get the response
        SOAPEnvelope response = inMsgtCtx.getEnvelope();
        System.out.println(response);
    

    【讨论】:

    • 很好的代码来演示消息构造是如何工作的。您错过了上下文中添加的信封(我添加了它)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多