दिलचस्प पोस्ट
इंटरनेट कनेक्शन का पता लगाना ऑफ़लाइन है? मर्ज सॉर्ट एल्गोरिथ्म का उपयोग करके इन्हें कैसे सॉर्ट करना है? संबद्ध एप्लिकेशन के साथ फाइल खोलें जावा: एक पाठ फ़ाइल कैसे पढ़ा जाए Android से KSOAP2 का उपयोग कर एक .NET Webservice कैसे कॉल करें? हैशमैप से सम्मिलन आदेश से प्राप्त किए गए मानों का क्रम क्या है? क्या एक XSLT वर्तमान दिनांक सम्मिलित कर सकता है? कैसे खोज_पथ प्रभाव पहचानकर्ता संकल्प और "वर्तमान स्कीमा" उसी कोड को ifconfig के रूप में प्राप्त करने के लिए सी कोड का उपयोग करना रीड-ओनली जीयूआई प्रॉपर्टी को फिर से देखें मॉडेेल में वापस ExecJS और जावास्क्रिप्ट रनटाइम नहीं मिला संरचना पैडिंग और पैकिंग एंड्रॉइड फ्रेगमेंट बैक स्टैक के साथ समस्याएं जावा में ओवरराइड होने के बराबर और हैशोड होने पर किस मुद्दे पर विचार किया जाना चाहिए? VBA में कन्स्ट्रक्टर को तर्क दें

एक्सएमएल अनुरोध / उत्तर देना जेएडएस-डब्ल्यूएस के साथ प्रतिक्रियाएं

JAX-WS संदर्भ कार्यान्वयन (1 JDK 1.5 और बेहतर में शामिल) के साथ प्रकाशित एक webservice के लिए कच्चे अनुरोध / प्रतिक्रिया XML तक पहुंच पाने के लिए क्या एक आसान तरीका है (उर्फ: प्रॉक्सी का उपयोग नहीं करना)? कोड के माध्यम से ऐसा करने में सक्षम होने के नाते मुझे क्या करना चाहिए बस चालाक लॉगिंग कॉन्फ़िगरेशन द्वारा फ़ाइल में लॉग इन करने के लिए अच्छा होगा, लेकिन पर्याप्त होगा

मुझे पता है कि अन्य अधिक जटिल और पूर्ण रूपरेखा मौजूद हैं जो ऐसा कर सकते हैं, लेकिन मैं इसे यथासंभव सरल और अक्ष, सीएक्सएफ, आदि रखना चाहूंगा, सब कुछ काफी ऊंचा हो जाएगा जिसे मैं बचाना चाहता हूं

धन्यवाद!

वेब के समाधान से एकत्रित समाधान "एक्सएमएल अनुरोध / उत्तर देना जेएडएस-डब्ल्यूएस के साथ प्रतिक्रियाएं"

निम्नलिखित विकल्प कंसोल (तकनीकी रूप से, आपको इनमें से केवल एक की आवश्यकता होती है, लेकिन यह आपके द्वारा उपयोग की जाने वाली लाइब्रेरी पर निर्भर करता है, इसलिए सभी चार को सुरक्षित विकल्प सेट करने पर) प्रवेश करने में सक्षम होता है आप इसे कोड में उदाहरण के तौर पर सेट कर सकते हैं, या कमांड लाइन पैरामीटर के रूप में- डी का उपयोग कर या उपेंद्र द्वारा लिखी गई पर्यावरण चर के रूप में।

System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true"); System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true"); System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true"); System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true"); 

जेएक्स-डब्लूएस के साथ एक्सएमएल अनुरोध / प्रतिक्रियाओं को ट्रेसिंग करें जब विवरण के लिए त्रुटि आती है तो प्रश्न देखें।

यहां कच्चे कोड का समाधान है (स्टजोर्न्रो और शामिक को धन्यवाद देना):

 Endpoint ep = Endpoint.create(new WebserviceImpl()); List<Handler> handlerChain = ep.getBinding().getHandlerChain(); handlerChain.add(new SOAPLoggingHandler()); ep.getBinding().setHandlerChain(handlerChain); ep.publish(publishURL); 

जहां SOAPLoggingHandler है (लिंक किए गए उदाहरणों से फट):

 package com.myfirm.util.logging.ws; import java.io.PrintStream; import java.util.Map; import java.util.Set; import javax.xml.namespace.QName; import javax.xml.soap.SOAPMessage; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; /* * This simple SOAPHandler will output the contents of incoming * and outgoing messages. */ public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> { // change this to redirect output if desired private static PrintStream out = System.out; public Set<QName> getHeaders() { return null; } public boolean handleMessage(SOAPMessageContext smc) { logToSystemOut(smc); return true; } public boolean handleFault(SOAPMessageContext smc) { logToSystemOut(smc); return true; } // nothing to clean up public void close(MessageContext messageContext) { } /* * Check the MESSAGE_OUTBOUND_PROPERTY in the context * to see if this is an outgoing or incoming message. * Write a brief message to the print stream and * output the message. The writeTo() method can throw * SOAPException or IOException */ private void logToSystemOut(SOAPMessageContext smc) { Boolean outboundProperty = (Boolean) smc.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outboundProperty.booleanValue()) { out.println("\nOutbound message:"); } else { out.println("\nInbound message:"); } SOAPMessage message = smc.getMessage(); try { message.writeTo(out); out.println(""); // just to add a newline } catch (Exception e) { out.println("Exception in handler: " + e); } } } 

टॉमकेट शुरू करने से पहले, लिनक्स एनवाइम्स में नीचे के रूप में JAVA_OPTS सेट करें। फिर टॉमकेट प्रारंभ करें आप catalina.out फ़ाइल में अनुरोध और प्रतिक्रिया देखेंगे।

 export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true" 

अन्य उत्तरों में वर्णित अनुसार, इस प्रोग्राम को करने के कई तरीके हैं, लेकिन वे काफी आक्रामक तंत्र हैं। हालांकि, अगर आपको पता है कि आप जेएक्स-डब्ल्यूएस आरआई (उर्फ "मेट्रो") का उपयोग कर रहे हैं, तो आप इसे कॉन्फ़िगरेशन स्तर पर कर सकते हैं। यह कैसे करें पर निर्देश के लिए यहां देखें । आपके आवेदन के बारे में गड़बड़ करने की आवश्यकता नहीं है।

// यह समाधान एक तरीका प्रदान करता है जिस पर प्रोग्रामर रूप से वेब सर्विसेज़ क्लेन w / o एक्सएमएल कॉन्फ़िग में हैंडलर जोड़ता है

// यहां पूर्ण दस्तावेज़ देखें: http://docs.oracle.com/cd/E17904_01//web.1111/e13734/handlers.htm#i222476

// नया वर्ग बनाएँ जो SOAPHandler लागू करता है

 public class LogMessageHandler implements SOAPHandler<SOAPMessageContext> { @Override public Set<QName> getHeaders() { return Collections.EMPTY_SET; } @Override public boolean handleMessage(SOAPMessageContext context) { SOAPMessage msg = context.getMessage(); //Line 1 try { msg.writeTo(System.out); //Line 3 } catch (Exception ex) { Logger.getLogger(LogMessageHandler.class.getName()).log(Level.SEVERE, null, ex); } return true; } @Override public boolean handleFault(SOAPMessageContext context) { return true; } @Override public void close(MessageContext context) { } } 

// प्रोग्राममैटिकल अपने लॉग मेसेजहैंडलर जोड़ें

  com.csd.Service service = null; URL url = new URL("https://service.demo.com/ResService.svc?wsdl"); service = new com.csd.Service(url); com.csd.IService port = service.getBasicHttpBindingIService(); BindingProvider bindingProvider = (BindingProvider)port; Binding binding = bindingProvider.getBinding(); List<Handler> handlerChain = binding.getHandlerChain(); handlerChain.add(new LogMessageHandler()); binding.setHandlerChain(handlerChain); 

निम्न सिस्टम गुण सेट करें, यह XML लॉगिंग सक्षम करेगा आप इसे जावा या कॉन्फ़िगरेशन फ़ाइल में सेट कर सकते हैं।

 static{ System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true"); System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true"); System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true"); System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true"); } 

सांत्वना लॉग:

 INFO: Outbound Message --------------------------- ID: 1 Address: http://localhost:7001/arm-war/castService Encoding: UTF-8 Http-Method: POST Content-Type: text/xml Headers: {Accept=[*/*], SOAPAction=[""]} Payload: xml -------------------------------------- INFO: Inbound Message ---------------------------- ID: 1 Response-Code: 200 Encoding: UTF-8 Content-Type: text/xml; charset=UTF-8 Headers: {content-type=[text/xml; charset=UTF-8], Date=[Fri, 20 Jan 2017 11:30:48 GMT], transfer-encoding=[chunked]} Payload: xml -------------------------------------- 

आपको एक javax.xml.ws.handler.LogicalHandler को कार्यान्वित करने की आवश्यकता है, इस हैंडलर को फिर से एक हेन्डलर कॉन्फ़िगरेशन फ़ाइल में संदर्भित करने की आवश्यकता है, जो कि आपकी सेवा समापन बिंदु (इंटरफ़ेस या कार्यान्वयन) में @HandlerChain एनोटेशन द्वारा संदर्भित है। तब आप या तो system.out के जरिए संदेश आउटपुट कर सकते हैं या आपकी प्रोसेस मेसेज कार्यान्वयन में लॉगगर

देख

http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/twbs_jaxwshandler.html

http://java.sun.com/mailers/techtips/enterprise/2006/TechTips_June06.html

मैं एक नया उत्तर पोस्ट कर रहा हूं, क्योंकि मेरे पास एंटोनियो द्वारा प्रदान की गई टिप्पणी पर पर्याप्त प्रतिष्ठा नहीं है (देखें: https://stackoverflow.com/a/1957777 )

यदि आप SOAP संदेश को एक फ़ाइल में मुद्रित करना चाहते हैं (उदाहरण के लिए Log4j द्वारा), तो आप इसका उपयोग कर सकते हैं:

 OutputStream os = new ByteArrayOutputStream(); javax.xml.soap.SOAPMessage soapMsg = context.getMessage(); soapMsg.writeTo(os); Logger LOG = Logger.getLogger(SOAPLoggingHandler.class); // Assuming SOAPLoggingHandler is the class name LOG.info(os.toString()); 

कृपया ध्यान दें कि कुछ निश्चित परिस्थितियों में, विधि कॉल लिखो () अपेक्षा के अनुरूप नहीं हो सकता है (देखें: https://community.oracle.com/thread/1123104?tstart=0 या https://www.java.net/node / 691073 ), इसलिए निम्न कोड चाल करेगा:

 javax.xml.soap.SOAPMessage soapMsg = context.getMessage(); com.sun.xml.ws.api.message.Message msg = new com.sun.xml.ws.message.saaj.SAAJMessage(soapMsg); com.sun.xml.ws.api.message.Packet packet = new com.sun.xml.ws.api.message.Packet(msg); Logger LOG = Logger.getLogger(SOAPLoggingHandler.class); // Assuming SOAPLoggingHandler is the class name LOG.info(packet.toString()); 

समापन बिंदु इंटरफ़ेस में SOAPHandler को इंजेक्ट करें हम SOAP अनुरोध और प्रतिक्रिया का पता लगा सकते हैं

प्रोग्रामिंग के साथ SOAPHandler को कार्यान्वित करना

 ServerImplService service = new ServerImplService(); Server port = imgService.getServerImplPort(); /**********for tracing xml inbound and outbound******************************/ Binding binding = ((BindingProvider)port).getBinding(); List<Handler> handlerChain = binding.getHandlerChain(); handlerChain.add(new SOAPLoggingHandler()); binding.setHandlerChain(handlerChain); 

सजावटी @HandlerChain(file = "handlers.xml") जोड़कर अपने समापन बिंदु इंटरफ़ेस पर टिप्पणी।

handlers.xml

 <?xml version="1.0" encoding="UTF-8"?> <handler-chains xmlns="http://java.sun.com/xml/ns/javaee"> <handler-chain> <handler> <handler-class>SOAPLoggingHandler</handler-class> </handler> </handler-chain> </handler-chains> 

SOAPLoggingHandler.java

 /* * This simple SOAPHandler will output the contents of incoming * and outgoing messages. */ public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> { public Set<QName> getHeaders() { return null; } public boolean handleMessage(SOAPMessageContext context) { Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (isRequest) { System.out.println("is Request"); } else { System.out.println("is Response"); } SOAPMessage message = context.getMessage(); try { SOAPEnvelope envelope = message.getSOAPPart().getEnvelope(); SOAPHeader header = envelope.getHeader(); message.writeTo(System.out); } catch (SOAPException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } public boolean handleFault(SOAPMessageContext smc) { return true; } // nothing to clean up public void close(MessageContext messageContext) { } } 

आप webservice के सामने एक ServletFilter डालने का प्रयास कर सकते हैं और सेवा से आने / जाने वाले अनुरोध और प्रतिक्रिया का निरीक्षण कर सकते हैं।

यद्यपि आप विशेष रूप से एक प्रॉक्सी के लिए नहीं पूछा था, कभी-कभी मुझे लगता है कि कनेक्शन पर क्या चल रहा है यह देखने के लिए tcptrace पर्याप्त है। यह एक सरल उपकरण है, कोई इंस्टॉल नहीं है, यह डेटा स्ट्रीम दिखाता है और फ़ाइल भी लिख सकता है।

रनटाइम में आप बस निष्पादित कर सकते थे

 com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump = true 

चूंकि डंप के रूप में वर्ग में परिभाषित एक सार्वजनिक वर्जन है

 public static boolean dump; 

क्या मैं यह समझने में सही हूं कि आप कच्चे XML संदेश को बदलना / उपयोग करना चाहते हैं?

यदि हां, तो आप (या चूंकि यह पांच साल का है, अगले व्यक्ति) प्रदाता इंटरफ़ेस पर नजर रखना चाहते हैं जो कि जेएडएडब्ल्यूएस का हिस्सा है। क्लाइंट समकक्ष "डिस्पैच" क्लास का उपयोग करके किया जाता है। फिर भी, आपको हेन्डलर्स या इंटरसेप्टर जोड़ने की ज़रूरत नहीं है आप अभी भी कर सकते हैं, बिल्कुल। नकारात्मक पक्ष इस तरह है, आप SOAPMessage के निर्माण के लिए पूरी तरह से ज़िम्मेदार हैं, लेकिन इसकी आसान है, और यदि आप चाहते हैं कि (जैसा मैंने किया था) यह सही है

यहां सर्वर साइड के लिए एक उदाहरण है (बिट अनाड़ी, यह सिर्फ प्रयोग करने के लिए था) –

 @WebServiceProvider(portName="Provider1Port",serviceName="Provider1",targetNamespace = "http://localhost:8123/SoapContext/SoapPort1") @ServiceMode(value=Service.Mode.MESSAGE) public class Provider1 implements Provider<SOAPMessage> { public Provider1() { } public SOAPMessage invoke(SOAPMessage request) { try{ File log= new File("/home/aneeshb/practiceinapachecxf/log.txt");//creates file object FileWriter fw=new FileWriter(log);//creates filewriter and actually creates file on disk fw.write("Provider has been invoked"); fw.write("This is the request"+request.getSOAPBody().getTextContent()); MessageFactory mf = MessageFactory.newInstance(); SOAPFactory sf = SOAPFactory.newInstance(); SOAPMessage response = mf.createMessage(); SOAPBody respBody = response.getSOAPBody(); Name bodyName = sf.createName("Provider1Insertedmainbody"); respBody.addBodyElement(bodyName); SOAPElement respContent = respBody.addChildElement("provider1"); respContent.setValue("123.00"); response.saveChanges(); fw.write("This is the response"+response.getSOAPBody().getTextContent()); fw.close(); return response;}catch(Exception e){return request;} } } 

आप इसे प्रकाशित करते हैं जैसे आप एक एसईआई,

 public class ServerJSFB { protected ServerJSFB() throws Exception { System.out.println("Starting Server"); System.out.println("Starting SoapService1"); Object implementor = new Provider1();//create implementor String address = "http://localhost:8123/SoapContext/SoapPort1"; JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();//create serverfactorybean svrFactory.setAddress(address); svrFactory.setServiceBean(implementor); svrFactory.create();//create the server. equivalent to publishing the endpoint System.out.println("Starting SoapService1"); } public static void main(String args[]) throws Exception { new ServerJSFB(); System.out.println("Server ready..."); Thread.sleep(10 * 60 * 1000); System.out.println("Server exiting"); System.exit(0); } } 

या आप इसके लिए एक समापन बिंदु वर्ग का उपयोग कर सकते हैं आशा है कि मददगार रहे हैं

और ओह, यदि आप चाहते हैं कि आपको हेडर और सामान के साथ सौदा करने की आवश्यकता नहीं है, यदि आप सेवा मोड को PAYLOAD में बदलते हैं (आप केवल साबुन बॉडी प्राप्त करेंगे)।

यहां सूचीबद्ध उत्तर जो आपको SOAPHandler का उपयोग करने के लिए मार्गदर्शित करते हैं, वे पूरी तरह से सही हैं। इस दृष्टिकोण का लाभ यह है कि यह किसी भी जेएडीएएस के कार्यान्वयन के साथ काम करेगा, क्योंकि SOAPHandler JAX-WS विनिर्देशन का हिस्सा है। हालांकि, SOAPHandler के साथ समस्या यह है कि यह पूरी तरह से स्मृति में पूरे XML संदेश का प्रतिनिधित्व करने का प्रयास करता है इससे विशाल स्मृति उपयोग हो सकता है जेएडएस-डब्लूएस के विभिन्न कार्यान्वयन ने इसके लिए अपना कामकाज जोड़ा है। यदि आप बड़े अनुरोधों या बड़ी प्रतिक्रियाओं के साथ काम करते हैं, तो आपको स्वामित्व दृष्टिकोणों में से एक को देखने की आवश्यकता है

चूंकि आप "जेडीके 1.5 या उससे बेहतर में शामिल हैं" के बारे में पूछते हैं, मैं जेएडएस-आरएसआई (उर्फ मेट्रो) के रूप में जाना जाता है, जो कि जेडीके के साथ शामिल है,

जेएडएस-डब्ल्यूएस आरआई का एक विशिष्ट समाधान है जो मेमोरी उपयोग के संदर्भ में बहुत ही कुशल है।

https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri देखें दुर्भाग्य से यह लिंक अब टूटा हुआ है लेकिन आप इसे WayBack मशीन पर पा सकते हैं। मैं नीचे हाइलाइइट देता हूं:

2007 में वापस मेट्रो के लोगों ने एक अतिरिक्त हैंडलर प्रकार, MessageHandler<MessageHandlerContext> , जो मेट्रो के मालिकाना है, की MessageHandler<MessageHandlerContext> । यह SOAPHandler<SOAPMessageContext> तुलना में कहीं अधिक कुशल है क्योंकि यह मेमोरी-डीओएम प्रतिनिधित्व करने की कोशिश नहीं करता है

मूल ब्लॉग आलेख से यहां महत्वपूर्ण पाठ है:

MessageHandler:

MessageHandler -डब्लूएस विनिर्देश द्वारा उपलब्ध कराए गए विस्तारयोग्य हैंडलर ढांचे का उपयोग और आरआई में बेहतर संदेश एब्स्ट्रक्चर, हमने अपने वेब सेवा अनुप्रयोगों को बढ़ाने के लिए एक नया हैंडलर MessageHandler किया है। MessageHandler SOAPHandler के समान है, सिवाय उसके कार्यान्वयन को MessageHandlerContext तक पहुंच जाता है (MessageContext का एक एक्सटेंशन)। MessageHandlerContext के माध्यम से एक संदेश का उपयोग कर सकता है और संदेश एपीआई का उपयोग कर उसे क्रियान्वित कर सकता है। जैसा कि मैंने ब्लॉग के शीर्षक में रखा है, यह हैंडलर आपको संदेश पर काम करने देता है, जो संदेश को केवल एक DOM आधारित संदेश तक पहुंचने / प्रोसेस करने के लिए कुशल तरीके प्रदान करता है हैंडलर का प्रोग्रामिंग मॉडल समान है और संदेश संचालकों को मानक लॉजिकल और एसओएपी हैंडलर के साथ मिलाया जा सकता है मैंने जेएक्स-डब्लूएस आरआई 2.1.3 में एक संदेश जोड़ा है जिसमें संदेश लॉग करने के लिए मेसहेन्डलर का उपयोग दिखा रहा है और यहां नमूने से एक स्निपेट है:

 public class LoggingHandler implements MessageHandler<MessageHandlerContext> { public boolean handleMessage(MessageHandlerContext mhc) { Message m = mhc.getMessage().copy(); XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out); try { m.writeTo(writer); } catch (XMLStreamException e) { e.printStackTrace(); return false; } return true; } public boolean handleFault(MessageHandlerContext mhc) { ..... return true; } public void close(MessageContext messageContext) { } public Set getHeaders() { return null; } } 

(2007 ब्लॉग पोस्ट से अंत उद्धरण)

अपने कस्टम हैंडलर को कहने की LoggingHandler है, उदाहरण के लिए LoggingHandler , किसी भी प्रभाव के लिए आपके हैंडलर चेन में जोड़े जाने की आवश्यकता है। यह किसी भी अन्य Handler को जोड़ने के समान है, ताकि आप इस पृष्ठ पर अन्य उत्तरों को देख सकें कि यह कैसे करना है।

आप मेट्रो GitHub रेपो में एक पूर्ण उदाहरण पा सकते हैं।

ऐसा करने का एक तरीका आपके कोड का उपयोग नहीं कर रहा है, लेकिन ईथरल या वायरशर्क जैसे नेटवर्क पैकेट स्निफ़र का उपयोग कर रहा है जो कि एचटीएमएफ़ पैकेट को पेलोड के रूप में एक्सएमएल संदेश के साथ कैप्चर कर सकता है और आप उन्हें फाइल में लॉग इन कर सकते हैं या

लेकिन अधिक परिष्कृत दृष्टिकोण अपने खुद के संदेश संचालकों को लिखना है आप यहां इसे देख सकते हैं।

वास्तव में। यदि आप HttpClientTransport के स्रोतों पर गौर करते हैं तो आप देखेंगे कि यह java.util.logging.logger में भी संदेश लिख रहा है। इसका अर्थ है कि आप उन संदेशों को भी अपने लॉग में देख सकते हैं।

उदाहरण के लिए यदि आप Log4J2 का उपयोग कर रहे हैं तो आपको निम्न की आवश्यकता है:

  • JUL-Log4J2 पुल को अपने वर्ग पथ में जोड़ें
  • com.sun.xml.internal.ws.transport.http.client पैकेज के लिए ट्रेसे स्तर निर्धारित करें।
  • add -Djava.util.logging.manager = org.apache.logging.log4j.jul.LogManager सिस्टम प्रॉपर्टी को अपने अनुप्रयोग प्रारंभ करने के लिए कमांड लाइन

इन चरणों के बाद आप अपने लॉग्स में SOAP संदेशों को देखना शुरू करते हैं।