Java 如何处理SOAP调用中的方法及其参数
API说我必须使用方法“getStock”和以下参数: accessToken、公司、项目编号、佣金编号。 我写了这段代码,但不起作用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
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);