肥皂和身体标签两次封装在轴2的响应中。

问题描述 投票:0回答:2

我试图运行apache axis2 webservice客户端,但我得到了一个如下所示的例外情况。

org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: 意外的子元素{http:/schemas.xmlsoap.orgsoapenvelope。}Body at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)

这里是web服务的wsdl。

<?xml version="1.0" encoding="UTF-8"?> 
- 
<wsdl:definitions targetNamespace="http://wtp" 
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" 
xmlns:ns="http://wtp" xmlns:ns1="http://org.apache.axis2/xsd" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
<wsdl:documentation> Please Type your service description here 
</wsdl:documentation> 
- 
<wsdl:types> 
- 
<xs:schema targetNamespace="http://wtp" elementFormDefault="qualified" 
attributeFormDefault="qualified"> 
- 
<xs:element name="authenticate"> 
- 
<xs:complexType> 
- 
<xs:sequence> 
<xs:element name="loginname" type="xs:string" nillable="true" 
minOccurs="0" /> 
<xs:element name="password" type="xs:string" nillable="true" 
minOccurs="0" /> 
</xs:sequence> 
</xs:complexType> 
</xs:element> 
- 
<xs:element name="authenticateResponse"> 
- 
<xs:complexType> 
- 
<xs:sequence> 
<xs:element name="return" type="xs:int" minOccurs="0" /> 
</xs:sequence> 
</xs:complexType> 
</xs:element> 
</xs:schema> 
</wsdl:types> 
- 
<wsdl:message name="authenticateRequest"> 
<wsdl:part name="parameters" element="ns:authenticate" /> 
</wsdl:message> 
- 
<wsdl:message name="authenticateResponse"> 
<wsdl:part name="parameters" element="ns:authenticateResponse" /> 
</wsdl:message> 
- 
<wsdl:portType name="LoginPortType"> 
- 
<wsdlperation name="authenticate"> 
<wsdl:input wsaw:Action="urn:authenticate" message="ns:authenticateRequest" /> 
<wsdlutput wsaw:Action="urn:authenticateResponse" 
message="ns:authenticateResponse" /> 
</wsdlperation> 
</wsdl:portType> 
- 
<wsdl:binding name="LoginSoap11Binding" type="ns:LoginPortType"> 
<soap:binding style="document" 
transport="http://schemas.xmlsoap.org/soap/http" /> 
- 
<wsdlperation name="authenticate"> 
<soapperation style="document" soapAction="urn:authenticate" /> 
- 
<wsdl:input> 
<soap:body use="literal" /> 
</wsdl:input> 
- 
<wsdlutput> 
<soap:body use="literal" /> 
</wsdlutput> 
</wsdlperation> 
</wsdl:binding> 
- 
<wsdl:binding name="LoginSoap12Binding" type="ns:LoginPortType"> 
<soap12:binding style="document" 
transport="http://schemas.xmlsoap.org/soap/http" /> 
- 
<wsdlperation name="authenticate"> 
<soap12peration style="document" soapAction="urn:authenticate" /> 
- 
<wsdl:input> 
<soap12:body use="literal" /> 
</wsdl:input> 
- 
<wsdlutput> 
<soap12:body use="literal" /> 
</wsdlutput> 
</wsdlperation> 
</wsdl:binding> 
- 
<wsdl:binding name="LoginHttpBinding" type="ns:LoginPortType"> 
<http:binding verb="POST" /> 
- 
<wsdlperation name="authenticate"> 
<httpperation location="authenticate" /> 
- 
<wsdl:input> 
<mime:content type="text/xml" part="parameters" /> 
</wsdl:input> 
- 
<wsdlutput> 
<mime:content type="text/xml" part="parameters" /> 
</wsdlutput> 
</wsdlperation> 
</wsdl:binding> 
- 
<wsdl:service name="Login"> 
- 
<wsdl:port name="LoginHttpSoap11Endpoint" binding="ns:LoginSoap11Binding"> 
<soap:address 
location="http://localhost:8080/Navigato/services/Login.LoginHttpSoap11Endpoint/" /> 
</wsdl:port> 
- 
<wsdl:port name="LoginHttpSoap12Endpoint" binding="ns:LoginSoap12Binding"> 
<soap12:address 
location="http://localhost:8080/Navigato/services/Login.LoginHttpSoap12Endpoint/" /> 
</wsdl:port> 
- 
<wsdl:port name="LoginHttpEndpoint" binding="ns:LoginHttpBinding"> 
<http:address 
location="http://localhost:8080/Navigato/services/Login.LoginHttpEndpoint/" /> 
</wsdl:port> 
</wsdl:service> 
</wsdl:definitions> 

以下是来自 soap ui 的 soap 请求和响应数据包。

皂液请求

<?xml version='1.0' encoding='utf-8'?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
<ns1:authenticate xmlns:ns1="http://wtp"> 
<ns1:loginname>john</ns1:loginname> 
<ns1:password>123</ns1:password> 
</ns1:authenticate> 
</soapenv:Body> 
</soapenv:Envelope>

皂液反应

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
<ns:authenticateResponse xmlns:ns="http://wtp"> 
<ns:return>1</ns:return> 
</ns:authenticateResponse> 
</soapenv:Body> 
</soapenv:Envelope> 

但是当响应到达客户端存根的时候,存根接收到的响应是这样的

<?xml version='1.0' encoding='utf-8'?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
<soapenv:Envelope> 
<soapenv:Body> 
<ns:authenticateResponse xmlns:ns="http://wtp"> 
<ns:return>1</ns:return> 
</ns:authenticateResponse> 
</soapenv:Body> 
</soapenv:Envelope> 
</soapenv:Body> 
</soapenv:Envelope> 

在这里,肥皂和身体被封装了两次。

结果,客户端stub无法解析并抛出以下错误。

org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {http:/schemas.xmlsoap.orgsoapenvelope。}Body at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)

客户代码

public class LoginClient 
{
    public static void main(String args[])
    {
        try {
            LoginStub stub = new LoginStub();
            Authenticate auth = new Authenticate();
            auth.setLoginname("john");
            auth.setPassword("123");
            AuthenticateResponse res = stub.authenticate(auth);
            System.out.println(res.get_return());
        } catch (AxisFault e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
axis2
2个回答
0
投票

你的客户端代码是怎么写的?你是否正确设置了消息的内容类型,在某些情况下,axis2认为消息不是soap消息,于是又用soap信封包裹起来,当你在axis2中收到响应时,检查一下它的内容类型,应该是textxml

© www.soinside.com 2019 - 2024. All rights reserved.