При вызове веб-службы SOAP возникает ошибка AxisFault faultCode: 90010001

#web-services #soap #wsdl #soap-client #webservice-client

#веб-службы #soap #wsdl #soap-клиент #веб-сервис-клиент

Вопрос:

Я создал клиент веб-службы SOAP из URL-адреса WSDL / WSDL и пытаюсь вызвать службу. Я получаю эту ошибку (трассировка ошибок)

 AxisFault
 faultCode: 90010001
 faultSubcode: 
 faultString: Mandatory field is not set in EAI_SOAPINPUT; Element -amp;> Environment.eaiCommon.BTID, Environment.eaiCommon.Header.ChannelID, Environment.eaiCommon.Header.RequestUUID, Environment.eaiCommon.Header.ServiceRequestId, Environment.eaiCommon.Header.ServiceRequestVersion
 faultActor: 
 faultNode: 
 faultDetail: 
    {http://xml.apache.org/axis/}stackTrace:Mandatory field is not set in EAI_SOAPINPUT; Element -amp;> Environment.eaiCommon.BTID, Environment.eaiCommon.Header.ChannelID, Environment.eaiCommon.Header.RequestUUID, Environment.eaiCommon.Header.ServiceRequestId, Environment.eaiCommon.Header.ServiceRequestVersion
    at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
    at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
    at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
    at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at uk.co.mclsoftware.www.HunterII.WebServices.MatchingSoapStub.match(MatchingSoapStub.java:116)
    at uk.co.mclsoftware.www.HunterII.WebServices.MatchingSoapProxy.match(MatchingSoapProxy.java:50)
    at com.huntermatching.test.TestClient.main(TestClient.java:14)
 

он запрашивает у меня обязательные поля.
что это за ошибка?

часть сообщения из wsdl:

 <wsdl:message name="subHeader">
        <wsdl:part element="xsd:subHeader" name="subHeader" />
    </wsdl:message>
    <wsdl:message name="MatchSoapIn">
        <wsdl:part element="tns:Match" name="parameters" />
    </wsdl:message>
    <wsdl:message name="MatchSoapOut">
        <wsdl:part element="tns:MatchResponse" name="parameters" />
    </wsdl:message>
    <wsdl:portType name="MatchingSoap">
        <wsdl:operation name="Match">
            <wsdl:input message="tns:MatchSoapIn" />
            <wsdl:output message="tns:MatchSoapOut" />
        </wsdl:operation>
    </wsdl:portType>
 

Мой клиентский java-класс

 public class TestMatchClient {

    public static void main(String[] args) {

        try {
            MatchingSoapProxy matchObj = new MatchingSoapProxy();

            String  controlXml="TestXmlString",batchXml="TestBatchXmlString",uName ="MyUserName",pass = "MyPass";

            matchObj.match(controlXml, batchXml, uName, pass);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
 

Комментарии:

1. Вы полностью заполняете объект запроса? Похоже, сервер сгенерировал ошибку из-за неправильного вызова. Пожалуйста, добавьте вызывающий код и, по крайней мере, часть сообщения WSDL, чтобы копнуть немного глубже в этом.

2. Привет @BigMike, я добавил тег сообщения из wsdl, спасибо за ответ

3. Возможно, я ошибаюсь, но мы не готовили объект заголовка запроса вручную, он генерируется из классов-заглушек. Если я должен подготовить запрос с обязательным параметром, то, пожалуйста, скажите мне, как подготовить объект запроса из моей службы.

4. Обычно вам нужно задать поля для сгенерированного объекта запроса. Сгенерированная заглушка просто создает конверт SOAP, а не внутреннее сообщение. Как только у вас есть объект запроса, вы должны проверить его на наличие установщика и соответствующим образом заполнить поля. Совет: в eclipse после выделения объекта запроса проверьте все методы set … . Вы должны увидеть все, что нужно установщику для заполнения tns: Тип соответствия.

5. @BigMike, я добавил свой клиентский код, я вызываю свою службу сопоставления, используя объект прокси-класса, и я не нашел другого метода установки для этого. как я должен вызвать свой сервисный метод, пожалуйста, предоставьте любую ссылку или фрагмент кода.