2017-04-18 11 views
0

soap 요청을 java에서 SAAJ을 사용하여 만들려고합니다. 필요한 XMLSAAJ를 사용하여 비누 요청을 만들 수 없습니다.

<SOAP-ENV:Envelope 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:paygo="http://paygo24.com/v3/protocol" 
xmlns:tem="http://tempuri.org/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
    <tem:SendRequest> 
     <paygo:request xsi:type="paygo:RegisterCheckRequest" Service="42" Id="7a646d45-ee2f-4b1c-8de8-780c416fbbd0"> 
      <PaymentParameters> 
       <Parameter Name="account" Value="08374829"/> 
      </PaymentParameters> 
     </paygo:request> 
     <tem:pointId>46</tem:pointId> 
     <tem:password>alkdsjflasdkjfl+ak87+UI90==</tem:password> 
    </tem:SendRequest> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

JAVA SAAJ

package ussd.utils; 
import javax.xml.namespace.QName; 
import javax.xml.soap.*; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 

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://paygo24.com/v3/protocol"; 
     SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url); 

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

     soapConnection.close(); 
    } 

    private static void createSoapResponse(SOAPMessage soapResponse) throws Exception { 
     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     Source sourceContent = soapResponse.getSOAPPart().getContent(); 
     System.out.println("\n----------SOAP Response-----------"); 
     StreamResult result = new StreamResult(System.out); 
     transformer.transform(sourceContent, result); 
    } 

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

     SOAPEnvelope envelope = soapPart.getEnvelope();  
     envelope.removeNamespaceDeclaration(envelope.getPrefix()); 
     envelope.addNamespaceDeclaration("SOAP-ENV","http://schemas.xmlsoap.org/soap/envelope/"); 
     envelope.setPrefix("SOAP-ENV");    

     envelope.addNamespaceDeclaration("paygo","http://paygo24.com/v3/protocol"); 
     envelope.addNamespaceDeclaration("tem","http://tempuri.org/"); 
     envelope.addNamespaceDeclaration("xsd","http://www.w3.org/2001/XMLSchema"); 
     envelope.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema-instance"); 


     SOAPHeader header=soapMessage.getSOAPHeader();      
     header.setPrefix("SOAP-ENV");  
     SOAPBody soapBody = envelope.getBody(); 
     soapBody.setPrefix("SOAP-ENV"); 
     SOAPElement root=soapBody.addChildElement(new QName("tem:SendRequest")); 
     SOAPElement request=root.addChildElement(new QName("paygo:request")); 

     //SOAPElement root=soapBody.addChildElement(new QName("","tem:SendRequest"));  
     //SOAPElement request=root.addChildElement(new QName("","paygo:request"));  
     request.setAttribute("xsi:type", "paygo:RegisterCheckRequest"); 
     request.setAttribute("Id","7a646d45-ee2f-4b1c-8de8-780c416fbbd0"); 
     request.setAttribute("Service","42");   
     SOAPElement paymentParameters =request.addChildElement(new QName(" ","PaymentParameters")); 

     SOAPElement parameter=paymentParameters.addChildElement("Parameter");   
     paymentParameters.setAttribute("xmlns",""); 
     parameter.setAttribute("Name","account"); 
     parameter.setAttribute("Value", "08374829"); 
     root.addChildElement("tem:pointId").setValue("46");  
     root.addChildElement("tem:password").setValue("alkdsjflasdkjfl+ak87+UI90==");   
     soapMessage.getSOAPHeader().detachNode(); 
     soapMessage.saveChanges(); 

     soapMessage.writeTo(System.out); 


     return soapMessage; 
    } 

} 

하지만 SOAPElement request=root.addChildElement(new QName("paygo:request")); 줄에서 다음과 같은 예외가 점점 오전 : 나는 XML 다음 만들려고 노력하고 있습니다. 예외

Exception in thread "main" org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces. 
    at com.sun.org.apache.xerces.internal.dom.ElementNSImpl.setName(Unknown Source) 
    at com.sun.org.apache.xerces.internal.dom.ElementNSImpl.<init>(Unknown Source) 
    at com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl.<init>(Unknown Source) 
    at com.sun.xml.internal.messaging.saaj.soap.impl.ElementFactory.createElement(Unknown Source) 
    at com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl.createElement(Unknown Source) 
    at com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl.createElement(Unknown Source) 
    at com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl.addElement(Unknown Source) 
    at com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl.addChildElement(Unknown Source) 
    at ussd.utils.SOAPClientSAAJ.createSOAPRequest(SOAPClientSAAJ.java:58) 
    at ussd.utils.SOAPClientSAAJ.main(SOAPClientSAAJ.java:18) 
+0

SAAJ와 같은 저수준 API를 사용하는 이유는 무엇입니까? – user1516873

+0

그래서 무엇을 사용해야합니까? 다른 대안은 무엇입니까 – JPG

+0

SOAP 라이브러리 (예 : cxf http://cxf.apache.org/)를 사용하여 WSDL로 서비스 클래스를 생성하고 일반 Java 객체를 사용하여 메소드를 호출 할 수 있습니다 , XML 또는 SOAP 봉투를 건드리지 않아도됩니다. – user1516873

답변

1

는 원하는 형식을 만들어야합니다,이 SOAP 봉투 생성 코드를 사용해보십시오.

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

     SOAPEnvelope envelope = soapPart.getEnvelope();  
     envelope.removeNamespaceDeclaration(envelope.getPrefix()); 
     envelope.addNamespaceDeclaration("SOAP-ENV","http://schemas.xmlsoap.org/soap/envelope/"); 
     envelope.setPrefix("SOAP-ENV");    

     envelope.addNamespaceDeclaration("paygo","http://paygo24.com/v3/protocol"); 
     envelope.addNamespaceDeclaration("tem","http://tempuri.org/"); 
     envelope.addNamespaceDeclaration("xsd","http://www.w3.org/2001/XMLSchema"); 
     envelope.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema-instance"); 

     SOAPHeader header=soapMessage.getSOAPHeader();      
     header.setPrefix("SOAP-ENV");  
     SOAPBody soapBody = envelope.getBody(); 
     soapBody.setPrefix("SOAP-ENV"); 
     SOAPElement root=soapBody.addChildElement("SendRequest","tem"); 
     SOAPElement request=root.addChildElement("request","paygo");   
     request.setAttribute("xsi:type", "paygo:RegisterCheckRequest"); 
     request.setAttribute("Id","7a646d45-ee2f-4b1c-8de8-780c416fbbd0"); 
     request.setAttribute("Service","42");   
     SOAPElement paymentParameters =request.addChildElement("PaymentParameters"); 

     SOAPElement parameter=paymentParameters.addChildElement("Parameter");   
     paymentParameters.setAttribute("xmlns",""); 
     parameter.setAttribute("Name","account"); 
     parameter.setAttribute("Value", "08374829"); 
     root.addChildElement("pointId","tem").setValue("46");  
     root.addChildElement("password","tem").setValue("alkdsjflasdkjfl+ak87+UI90==");   
     soapMessage.getSOAPHeader().detachNode(); 
     soapMessage.saveChanges(); 

     soapMessage.writeTo(System.out); 


     return soapMessage; 
    } 
+0

정확한 xml 요청을 할 수는 있지만 문제는 잘못된 응답 예외가 발생합니다. '심각 : SAAJ0008 : 응답이 잘못되었습니다. 찾았습니다 "main"스레드의 예외 com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl : com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl : 잘못된 응답 : (302Found' – JPG

+1

오류에 따라 요청이 서버에 의해 다른 URL로 리디렉션됩니다. 올바른 URL을 얻고 시도해보십시오. 또한 SOAPUI/TCPMON을 사용하여 설정 프록시에서 디버그를 시도하고 응답이 무엇인지 확인하십시오. – ssanrao

+0

감사, 친구, 나 노력 해줘서 고맙습니다. 사실 지난 2 주 동안 병목 현상이있었습니다. 다시 한번 감사드립니다. – JPG