2009-02-06 9 views
58

मैंने जेएक्स-डब्ल्यूएस में एक एसओएपी वेब सेवा प्रदाता स्थापित किया है, लेकिन मुझे एसओएपीमेसेज (या किसी भी नोड) ऑब्जेक्ट से कच्चे एक्सएमएल को कैसे प्राप्त करना है, यह जानने में परेशानी हो रही है। यहाँ कोड मैं अभी मिल गया है का एक नमूना है, और जहां मैं एक्सएमएल हड़पने के लिए कोशिश कर रहा हूँ:जावा में SOAPMessage से कच्चे एक्सएमएल प्राप्त करना

@WebServiceProvider(wsdlLocation="SoapService.wsdl") 
@ServiceMode(value=Service.Mode.MESSAGE) 
public class SoapProvider implements Provider<SOAPMessage> 
{ 
    public SOAPMessage invoke(SOAPMessage msg) 
    { 
     // How do I get the raw XML here? 
    } 
} 

वहाँ मूल अनुरोध के एक्सएमएल प्राप्त करने के लिए एक आसान तरीका है? यदि एक अलग प्रकार के प्रदाता (जैसे स्रोत) की स्थापना करके कच्चे एक्सएमएल को पाने का कोई तरीका है, तो मैं भी ऐसा करने को तैयार हूं।

उत्तर

11

ऐसा लगता है कि एक इस तरह से, प्रदाता < स्रोत> का उपयोग करके कच्चे एक्सएमएल प्राप्त कर सकते हैं:

import java.io.ByteArrayOutputStream; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.ws.Provider; 
import javax.xml.ws.Service; 
import javax.xml.ws.ServiceMode; 
import javax.xml.ws.WebServiceProvider; 

@ServiceMode(value=Service.Mode.PAYLOAD) 
@WebServiceProvider() 
public class SoapProvider implements Provider<Source> 
{ 
    public Source invoke(Source msg) 
    { 
     StreamResult sr = new StreamResult(); 

     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     sr.setOutputStream(out); 

     try { 
      Transformer trans = TransformerFactory.newInstance().newTransformer(); 
      trans.transform(msg, sr); 

      // Use out to your heart's desire. 
     } 
     catch (TransformerException e) { 
      e.printStackTrace(); 
     }  

     return msg; 
    } 
} 

मैं समाप्त हो गया गया है इस समाधान की जरूरत नहीं है, इसलिए मैं वास्तव में इस प्रयास नहीं किया है कोड स्वयं - इसे सही पाने के लिए कुछ tweaking की आवश्यकता हो सकती है। लेकिन मुझे पता है कि वेब सेवा से कच्चे एक्सएमएल प्राप्त करने के लिए यह सही रास्ता है।

(मुझे यकीन नहीं है कि अगर आपको पूरी तरह से SOAPMessage ऑब्जेक्ट होना चाहिए, तो फिर यह काम कैसे करें, लेकिन फिर, यदि आप कच्चे एक्सएमएल को किसी भी तरह से संभालने जा रहे हैं, तो आप उच्च स्तरीय ऑब्जेक्ट का उपयोग क्यों करेंगे ?)

+0

एक '' StringWriter' ByteArrayOutputStream' + 'StreamResult' संयोजन के लिए एक अच्छा विकल्प है, यदि आप एक्सएमएल को सही एन्कोडिंग – artbristol

131

आप इस तरह से प्रयास कर सकते हैं।

SOAPMessage msg = messageContext.getMessage(); 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
msg.writeTo(out); 
String strMsg = new String(out.toByteArray()); 
+4

के साथ 'स्ट्रिंग' के रूप में चाहते हैं तो यह शानदार है। – user85155

+3

यह – artbristol

+0

खाते में वर्ण एन्कोडिंग नहीं लेता है क्या यह डीओएम ऑब्जेक्ट्स या जैसे निर्माण के साथ कुछ मेमोरी का उपभोग करेगा? या क्या यह वास्तव में एक्सएमएल को आंतरिक रूप से पार्स किए बिना HTTP प्रतिक्रिया से कच्ची स्ट्रिंग देगा? – Ruslan

4

आप एक्सएमएल के लिए एक्सएमएल स्ट्रिंग स्वरूपण की जरूरत है, इस प्रयास करें:

String xmlStr = "your-xml-string"; 
Source xmlInput = new StreamSource(new StringReader(xmlStr)); 
Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
transformer.transform(xmlInput, 
     new StreamResult(new FileOutputStream("response.xml"))); 
14

आप एक SOAPMessage या SOAPMessageContext है, तो आप एक Transformer उपयोग कर सकते हैं, यह के माध्यम से DOMSource एक Source को परिवर्तित करके:

  final SOAPMessage message = messageContext.getMessage(); 
      final StringWriter sw = new StringWriter(); 

      try { 
       TransformerFactory.newInstance().newTransformer().transform(
        new DOMSource(message.getSOAPPart()), 
        new StreamResult(sw)); 
      } catch (TransformerException e) { 
       throw new RuntimeException(e); 
      } 

      // Now you have the XML as a String: 
      System.out.println(sw.toString()); 

इस खाते में एन्कोडिंग ले जाएगा, तो अपने "विशेष वर्ण" घायल नहीं मिलेगा।

+0

सोल्यूशन स्मृति-उपभोग प्रदान किया जाता है? – lospejos

8
उद्देश्य सिर्फ डिबगिंग के लिए

, का उपयोग एक पंक्ति कोड -

msg.writeTo(System.out);

+0

ओपी सिस्टम के लिए आवश्यक रूप से डीबगिंग नहीं है।आउट (जो वेबसर्वर के लिए जरूरी रूप से सुलभ नहीं है) - उसे मूल एक्सएमएल को सॉकेट पर भेजने की आवश्यकता हो सकती है, उसे कहीं स्टोर कर सकते हैं, या इसके आंकड़ों की गणना कर सकते हैं। – hexafraction

+1

बस एक विकल्प के बारे में बता रहा है, और कुछ नहीं। धन्यवाद –

+0

आप आसानी से 'बाइटएरे ऑटपुटस्ट्रीम' को 'स्ट्रिंग' में परिवर्तित कर सकते हैं ... मुझे लगता है कि – vikingsteve

0

अगर आप ग्राहक कोड है तो आप सिर्फ एक्सएमएल अनुरोध/प्रतिक्रिया प्राप्त करने के लिए निम्नांकित दो पंक्तियों को जोड़ने की जरूरत है। यहाँ _callorg.apache.axis.client.Call

String request = _call.getMessageContext().getRequestMessage().getSOAPPartAsString(); 
String response = _call.getMessageContext().getResponseMessage().getSOAPPartAsString(); 
3

ट्रांसफार्मर फैक्टरी का उपयोग करना है: -

public static String printSoapMessage(final SOAPMessage soapMessage) throws TransformerFactoryConfigurationError, 
      TransformerConfigurationException, SOAPException, TransformerException 
    { 
     final TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     final Transformer transformer = transformerFactory.newTransformer(); 

     // Format it 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 

     final Source soapContent = soapMessage.getSOAPPart().getContent(); 

     final ByteArrayOutputStream streamOut = new ByteArrayOutputStream(); 
     final StreamResult result = new StreamResult(streamOut); 
     transformer.transform(soapContent, result); 

     return streamOut.toString(); 
    } 
1

इस काम करता है

final StringWriter sw = new StringWriter(); 

try { 
    TransformerFactory.newInstance().newTransformer().transform(
     new DOMSource(soapResponse.getSOAPPart()), 
     new StreamResult(sw)); 
} catch (TransformerException e) { 
    throw new RuntimeException(e); 
} 
System.out.println(sw.toString()); 
return sw.toString(); 
+0

कोड डंप की बजाय कुछ और स्पष्टीकरण अच्छा होगा। – Raidri

+0

कोई स्पष्टीकरण की आवश्यकता नहीं है। –

संबंधित मुद्दे