Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理SOAP调用中的方法及其参数_Java_Xml_Web Services_Soap_Saaj - Fatal编程技术网

Java 如何处理SOAP调用中的方法及其参数

Java 如何处理SOAP调用中的方法及其参数,java,xml,web-services,soap,saaj,Java,Xml,Web Services,Soap,Saaj,API说我必须使用方法“getStock”和以下参数: accessToken、公司、项目编号、佣金编号。 我写了这段代码,但不起作用 SOAPEnvelope envelope = soapPart.getEnvelope(); //envelope.addNamespaceDeclaration("sam", "http://samples.axis2.techdive.in"); // SOAP Body SOAPBody soapBody = envel

API说我必须使用方法“getStock”和以下参数: accessToken、公司、项目编号、佣金编号。 我写了这段代码,但不起作用

    SOAPEnvelope envelope = soapPart.getEnvelope();
    //envelope.addNamespaceDeclaration("sam", "http://samples.axis2.techdive.in");

    // SOAP Body
    SOAPBody soapBody = envelope.getBody();
    SOAPElement method = soapBody.addChildElement("getStock");
    SOAPElement firstParam = method.addChildElement("accessToken");
    firstParam.addTextNode("xxx");

    SOAPElement secondParam = method.addChildElement("company");
    secondParam.addTextNode("AS");

    SOAPElement thirdParam = method.addChildElement("itemNumber");
    thirdParam.addTextNode("020001");

    SOAPElement fourthParam = method.addChildElement("commissionNumber");
    fourthParam.addTextNode("0");

    soapMessage.saveChanges();
那么名称空间声明呢

我得到这个错误:

响应SOAP消息= ns2:客户端 找不到{}getStock的分派方法 进程已完成,退出代码为0


要指定前缀和名称空间,可以使用
Qname
对象
(import javax.xml.namespace.Qname;)
,如下所示:

QName stockQname = new QName("http://your_namespace_uri.com",
                "getStock", "prefix");
前缀更改为实际前缀

将名称空间更改为实际的名称空间URI

我重写了您的代码以使用QName:

private static void test() throws SOAPException {

        MessageFactory factory = MessageFactory
                .newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
        SOAPMessage message = factory.createMessage();
        SOAPPart soapPart = message.getSOAPPart();

        SOAPEnvelope envelope = soapPart.getEnvelope();

        SOAPBody soapBody = envelope.getBody();

        QName stockQname = new QName("http://your_namespace_uri.com",
                "getStock", "prefix");
        SOAPBodyElement stockElement = soapBody.addBodyElement(stockQname);

        QName accessQname = new QName("accessToken");
        SOAPElement accessElement = stockElement.addChildElement(accessQname);
        accessElement.addTextNode("xxx");

        QName companyQname = new QName("company");
        SOAPElement companyElement = stockElement.addChildElement(companyQname);
        companyElement.addTextNode("AS");

        QName itemQname = new QName("itemNumber");
        SOAPElement itemElement = stockElement.addChildElement(itemQname);
        itemElement.addTextNode("020001");

        QName commisionQname = new QName("commissionNumber");
        SOAPElement commissionElement = stockElement
                .addChildElement(commisionQname);
        commissionElement.addTextNode("0");

        message.saveChanges();
}
这是生成的SOAP消息:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <prefix:getStock xmlns:prefix="http://your_namespace_uri.com">
      <accessToken>xxx</accessToken>
      <company>AS</company>
      <itemNumber>020001</itemNumber>
      <commissionNumber>0</commissionNumber>
    </prefix:getStock>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
关于这一行:

MessageFactory factory = MessageFactory
                .newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
MessageFactory factory = MessageFactory
                .newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);

希望这有帮助

这是不是要求您不要使用更简单的方法,例如wsimport工具来导入目标wsdl并为您的创建客户端类,然后这些类将自动创建SOAP消息?我尝试了一下,但也导致了一个错误。[错误]org.xml.sax.SAXParseException;系统ID:;行号:1;栏目号:50;Leerstellen erforderlich zwischen publicId和systemId。Zeile 1 von WSDL konnte nicht geparst werdenIn在这种情况下,我会尝试先解决这个错误,而不是解决它。
MessageFactory factory = MessageFactory
                .newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);