2014-11-03 233 views
1

我提供了一个java代码,我在这里找到了堆栈溢出的地方,我想用我的目的类似的东西。此代码可以正常工作,但是我面临的问题仍然存在。检查我在代码中完成的系统操作。前两个系统输出,我打印得到响应的SOAP正文返回给我一个null,而当我尝试打印整个响应它打印准确。它非常奇怪。getSOAPBody返回NULL,而SOAPResponse.writeTo打印整个消息,奇怪?

有谁知道为什么发生这种情况,以及如何解决它。我使用JDK 1.7

package trials; 

import javax.xml.soap.MessageFactory; 
import javax.xml.soap.MimeHeaders; 
import javax.xml.soap.SOAPBody; 
import javax.xml.soap.SOAPConnection; 
import javax.xml.soap.SOAPConnectionFactory; 
import javax.xml.soap.SOAPElement; 
import javax.xml.soap.SOAPEnvelope; 
import javax.xml.soap.SOAPMessage; 
import javax.xml.soap.SOAPPart; 


public class SOAPClientSAAJ { 

public static void main(String args[]) throws Exception { 
    // Create SOAP Connection 
    SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); 
    SOAPConnection soapConnection = soapConnectionFactory.createConnection(); 

    // Send SOAP Message to SOAP Server 
    String url = "http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx"; 
    SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url); 

    System.out.println("Body"); 

    // print SOAP Response 
    System.out.print("Response SOAP Message:"); 

    System.out.println("SOAP Body 2= " + soapResponse.getSOAPBody()); 

    System.out.println("SOAP Body 2=" + soapResponse.getSOAPPart().getEnvelope().getBody()); 

    soapResponse.writeTo(System.out); 


    soapConnection.close(); 
} 

private static SOAPMessage createSOAPRequest() throws Exception { 
    MessageFactory messageFactory = MessageFactory.newInstance(); 
    SOAPMessage soapMessage = messageFactory.createMessage(); 
    SOAPPart soapPart = soapMessage.getSOAPPart(); 

    String serverURI = "http://ws.cdyne.com/"; 

    // SOAP Envelope 
    SOAPEnvelope envelope = soapPart.getEnvelope(); 
    envelope.addNamespaceDeclaration("example", serverURI); 

    /* 
    Constructed SOAP Request Message: 
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="http://ws.cdyne.com/"> 
     <SOAP-ENV:Header/> 
     <SOAP-ENV:Body> 
      <example:VerifyEmail> 
       <example:email>[email protected]</example:email> 
       <example:LicenseKey>123</example:LicenseKey> 
      </example:VerifyEmail> 
     </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 
    */ 

    // SOAP Body 
    SOAPBody soapBody = envelope.getBody(); 
    SOAPElement soapBodyElem = soapBody.addChildElement("VerifyEmail", "example"); 
    SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("email", "example"); 
    soapBodyElem1.addTextNode("[email protected]"); 
    SOAPElement soapBodyElem2 = soapBodyElem.addChildElement("LicenseKey", "example"); 
    soapBodyElem2.addTextNode("123"); 

    MimeHeaders headers = soapMessage.getMimeHeaders(); 
    headers.addHeader("SOAPAction", serverURI + "VerifyEmail"); 

    soapMessage.saveChanges(); 


    /* Print the request message */ 
    System.out.print("Request SOAP Message:"); 
    soapMessage.writeTo(System.out);   
    System.out.println(); 




    return soapMessage; 
} 

}

这是实现为["+getNodeName()+": "+getNodeValue()+"]输出,我得到的控制台

Request SOAP Message:<SOAP-ENV:Envelope xmlns:SOAP- ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="http://ws.cdyne.com/"><SOAP-ENV:Header/><SOAP-ENV:Body><example:VerifyEmail><example:email>[email protected]</example:email><example:LicenseKey>123</example:LicenseKey></example:VerifyEmail></SOAP-ENV:Body></SOAP-ENV:Envelope> 
Body 
Response SOAP Message:SOAP Body 2= [soap:Body: null] 
SOAP Body 2=[soap:Body: null] 
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><VerifyEmailResponse xmlns="http://ws.cdyne.com/"><VerifyEmailResult><ResponseText>Mail Server will accept email</ResponseText><ResponseCode>3</ResponseCode><LastMailServer>gmail-smtp-in.l.google.com</LastMailServer><GoodEmail>true</GoodEmail></VerifyEmailResult></VerifyEmailResponse></soap:Body></soap:Envelope> 

回答

1

toString()Node,并且getNodeValue()将为空元素节点。因此,您将获得[soap:Body: null]

但是,身体在那里,你可以像平常一样使用它。

请尝试以下方法看到,所有的元素都在那里:

SOAPBody body = soapResponse.getSOAPBody(); 
System.out.println(body.getElementsByTagName("ResponseText").item(0).getTextContent()); 
System.out.println(body.getElementsByTagName("ResponseCode").item(0).getTextContent()); 
System.out.println(body.getElementsByTagName("GoodEmail").item(0).getTextContent()); 
+0

谢谢。但后来我试图将它解组到一个java类来获得作为java对象的SOAP主体。这没有工作,因为我猜这个NULL的问题。任何指针? – ydb 2014-11-03 16:19:05

+0

由于身体存在,所以'null'不太可能是原因。也许你应该用你的编组代码和问题描述来创建一个新的问题。 – Khalid 2014-11-03 16:57:08

+0

这里是我与解组代码的新职位 - https://stackoverflow.com/questions/26719586/cannot-unmarshal-soap-body-to-java-object – ydb 2014-11-03 17:28:26

2

我遵循同样的教程为你做。

,并面临着同样的问题,只是如果别人需要这个,我通过删除名字空间别名“示例”解决了这个问题,在内部节点,我只把它放在第一个参数节点search

SOAPBody soapBody = envelope.getBody(); 
    SOAPElement soapBodyElem = soapBody.addChildElement("search", "example"); /*"example"*/ 

SOAPElement soapBodyElem0 = soapBodyElem.addChildElement("arg0"); 
SOAPElement soapBodyElem1 = soapBodyElem0.addChildElement("name"); 
soapBodyElem1.addTextNode("test"); 
SOAPElement soapBodyElem2 = soapBodyElem0.addChildElement("number"); 
soapBodyElem2.addTextNode("5"); 

MimeHeaders headers = soapMessage.getMimeHeaders(); 
headers.addHeader("SOAPAction", serverURI + "search"); 

正如我在soapUI的自动生成的XML(仅在search节点)看到

<example:search> 
     <!--Optional:--> 
     <arg0> 
      <!--Optional:--> 
      <name>234</name> 
      <number>5</number> 
     </arg0> 
     </example:search> 

这解决了我的问题。