2012-06-27 2 views
0

Я пытаюсь интегрировать вызовы SOAP в свое приложение Java. Я следил за различными учебниками онлайн, однако, когда я запускаю приложение, он дает ошибки на sm.saveChanges(), и если эта строка закомментирована, она дает ошибки в sm.writeTo(System.out).SOAP-вызовы в приложении Java

Ниже приведен код:

//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-библиотек, например, Ось Apache? – 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 Held и другими. Просто хочу упомянуть, действительно ли вы хотите интегрировать вызовы SOAP на таком низком уровне, вы можете сначала сделать это с помощью Apache Axis, чем провести некоторое расследование с помощью средств отслеживания отладки и http-пакетов, чтобы узнать, что вы пропустили. Этот способ стоит проблем для некоторых конкретных случаев, когда вы, например, пытаетесь вытащить отдельные узлы из ответа SOAP с помощью XPath, не связывая его сначала с объектами POJO.

0

Как @Udo Held упоминает, вы не хотите создавать запросы SOAP вручную.

Пожалуйста, смотрите ответ на этот вопрос: How to get response from SOAP?

Вы можете использовать wsimport инструмент для автоматического создание всего кода, необходимый для подключения к услуге SOAP.

wsimport поставляется с JDK, так что у вас уже есть в вашей системе (без дополнительных загрузок) и при условии, Java на вашем пути, вы можете перейти к любому терминалу и введите:

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

Это делается , вы сможете просто вызвать вызов веб-службы с помощью автоматически генерируемого кода, например:

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