2012-06-27 4 views
0

Java 응용 프로그램에 SOAP 호출을 통합하려고합니다. 온라인으로 다양한 튜토리얼을 따라 왔지만, 애플리케이션을 실행하면 sm.saveChanges()에 오류가 발생하고 해당 행이 주석 처리 된 경우 sm.writeTo(System.out)에 오류가 발생합니다.Java 응용 프로그램에서 SOAP 호출

//Create a SOAPConnection 
      SOAPConnectionFactory sfc = SOAPConnectionFactory.newInstance(); 
      SOAPConnection connection = sfc.createConnection(); 

      MessageFactory mf = MessageFactory.newInstance(); 
      SOAPMessage sm = mf.createMessage(); 
      SOAPPart sp = sm.getSOAPPart(); 
      SOAPEnvelope sv = sp.getEnvelope(); 

      SOAPHeader sh = sm.getSOAPHeader(); 
      //SOAPHeaderElement headerElement = sh.addHeaderElement(sv.createName("Signature", "SOAP-SEC", "http://schemas.xmlsoap.org/soap/security/2000-12")); 

      SOAPBody sb = sm.getSOAPBody(); 

      //sh.detachNode(); 


      MimeHeaders headers = sm.getMimeHeaders(); 
      headers.addHeader("SOAPAction", "\"\""); 
      //QName bodyName = new QName("http://quoteCompany.com", "GetQuote", "d"); 
      //QName bodyName = new QName(msisdn, "GetRioInformationsRequest", "ser"); 
      //QName bodyName = new QName("http://schemas.xmlsoap.org/soap/encoding/", "GetRioInformationsRequest", XMLConstants.DEFAULT_NS_PREFIX); 
      QName bodyName = new QName("http://quoteCompany.com/", "GetQuote", "ser"); 
      //QName bodyName = sv.createQName("http://quoteCompany.com/", "GetQuote", "ser"); 
      Name bodyName2 = sv.createName("GetQuote","ser", "http://quoteCompany.com/"); 
      SOAPBodyElement bodyElement = sb.addBodyElement(bodyName2); 
      //QName qn = new QName("aName"); 
      //Name qn = sv.createName("rioSearchRequest"); 
      QName qn = new QName("returnCode"); 

      SOAPElement quotation = bodyElement.addChildElement(qn); 
      //quotation.addChildElement(qn2); 

      //Name qn2 = sv.createName("msisdn"); 
      //qn2. 
      //quotation.addAttribute(qn2, msisdn); 
      //quotation.addTextNode("TextMode"); 
      quotation.addTextNode(msisdn); 

      System.out.println("Saving SOAP message."); 
      sm.saveChanges(); 
      System.out.println("\n Soap Request:\n"); 
      sm.writeTo(System.out); 
      System.out.println("Request Outputted for viewing."); 

      //URL endpoint = new URL("http://yourServer.com"); 
      URL endpoint = new URL("http://127.0.0.1:8088/mockSoapBinding"); 
      System.out.println("URL entered."); 
      SOAPMessage response = connection.call(sm, endpoint); 
      System.out.println("Resquest Sent!"); 
      System.out.println(response.getContentDescription()); 
      System.out.println("Response obtained!"); 

그리고 해당 오류는 다음과 같습니다 :

XSL-1101: (Fatal Error) DOMSource node as this type not supported. 
Jun 27, 2012 4:37:45 PM com.sun.xml.messaging.saaj.soap.MessageImpl saveChanges 
SEVERE: SAAJ0539: Unable to get header stream in saveChanges 
Jun 27, 2012 4:37:45 PM com.sun.xml.messaging.saaj.soap.MessageImpl saveChanges 
SEVERE: SAAJ0540: Error during saving a multipart message 
SOAP Call Issue: Error during saving a multipart message 
com.sun.xml.messaging.saaj.SOAPExceptionImpl: Error during saving a multipart message 
    at com.sun.xml.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1209) 
    at com.application.package.SOAPCalls.SOAPCall(SOAPCalls.java:66) 
    at com.application.package.Main.<init>(Main.java:97) 
    at com.application.package.Main.main(Main.java:253) 
Caused by: com.sun.xml.messaging.saaj.SOAPExceptionImpl: Unable to get header stream in saveChanges: 
    at com.sun.xml.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1179) 
    ... 3 more 
Caused by: java.io.IOException: XSL-1101: (Fatal Error) DOMSource node as this type not supported. 
    at com.sun.xml.messaging.saaj.soap.impl.EnvelopeImpl.output(EnvelopeImpl.java:306) 
    at com.sun.xml.messaging.saaj.soap.impl.EnvelopeImpl.output(EnvelopeImpl.java:317) 
    at com.sun.xml.messaging.saaj.soap.SOAPPartImpl.getContentAsStream(SOAPPartImpl.java:324) 
    at com.sun.xml.messaging.saaj.soap.MessageImpl.getHeaderBytes(MessageImpl.java:1020) 
    at com.sun.xml.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1171) 
    ... 3 more 

어떤 제안 아래

코드인가?

+0

같은 기존 SOAP 라이브러리 중 하나를 사용하고 싶지 않은 이유가 있습니까? 예를 들어, 다음과 같이 웹 서비스를 호출하면 자동으로 생성 된 코드를 사용하여 웹 서비스를 호출 할 수 있습니다. 아파치 축? – Drizzt321

+0

[this] (http://blog.aplikacja.info/2010/06/configurationexception-xml-22101-fatal-error-domsource-node-as-this-type-not-supported/) 링크도 확인하십시오. – Jeshurun

답변

3

정말 이것을 손으로하고 싶지는 않습니다. 웹 서비스 클라이언트를 생성하고 사용하십시오.

Apache Axis WSDL2Code을 사용할 수 있습니다. 클라이언트를 생성하는 다른 옵션도 있습니다. 예 : Eclipse는이를 수행하기 위해 built in tool을 가지고있다.

0

우도 (Udo) 개최 및 기타 사항에 동의합니다. 디버그 및 http 패킷 추적 도구를 사용하여 조사를 수행 한 것보다 Apache Axis로 먼저 수행 할 수있는 그러한 낮은 수준의 SOAP 호출을 실제로 통합하려는 경우 언급하지 않은 내용을 찾으십시오. 예를 들어 XPath를 사용하여 SOAP 응답에서 개별 노드를 처음에 POJO 객체에 바인딩하지 않고 꺼내려고하는 경우와 같은 특정 경우에 문제가 발생할 수 있습니다.

0

@Udo가 언급 한 것처럼 수동으로 SOAP 요청을 작성하고 싶지는 않습니다.

것은이 질문에 대한 답변을 참조하십시오 : 당신의 wsimport 도구를 사용할 수 있습니다 How to get response from SOAP?

는 SOAP 서비스에 연결하기 위해 필요한 모든 코드를 자동으로 생성.

wsimport http://www.url.to.wsdl.asmx?wsdl -p com.whateveruwant -Xnocompile -d . -keep 

이 진행되고 : 이미 시스템 (추가 다운로드) 및 Java가 경로에있는 가정에 그것을 가지고 있도록 JDK와

wsimport 선박, 당신은 터미널과 유형에 갈 수

CustomInterface soap = new CustomEndpoint().getCustomInterface(); 
System.out.println(soap.getAnswerFromWs("ParamValue"));