জ্যাক্স-ডাব্লুএস এর সাথে এক্সএমএল অনুরোধ / প্রতিক্রিয়াগুলি সন্ধান করা হচ্ছে


172

জ্যাকস-ডাব্লুএস রেফারেন্স প্রয়োগকরণ (জেডিকে ১.৫ এবং এর চেয়ে ভাল আরও অন্তর্ভুক্ত করা হয়েছে) দ্বারা প্রকাশিত ওয়েবসার্ভিসের কাঁচা অনুরোধ / প্রতিক্রিয়া এক্সএমএল অ্যাক্সেস পাওয়ার কোনও সহজ উপায় (যেমন: প্রক্সি ব্যবহার না করা) রয়েছে? কোডের মাধ্যমে তা করতে সক্ষম হওয়ায় আমার যা করা দরকার। কেবল চালাক লগিং কনফিগারেশন দ্বারা কোনও ফাইলটিতে এটি লগইন করা ভাল তবে যথেষ্ট হবে।

আমি জানি যে আরও জটিল এবং সম্পূর্ণ কাঠামো রয়েছে যা এটি করতে পারে তবে আমি এটিকে যতটা সম্ভব সহজ এবং অক্ষ, সিএক্সএফ ইত্যাদি রাখতে চাই এবং এড়াতে চাই এমন যথেষ্ট পরিমাণে ওভারহেড যুক্ত করি।

ধন্যবাদ!


5
কেবল একটি নোট: জ্যাক্স-ডাব্লুএস একটি মান, যা সিএক্সএফ প্রয়োগ করে।
বোজহো

<br>: জাভা সিস্টেম বৈশিষ্ট্য নির্ধারণ ও বিভিন্ন পরিবেশের দেখতে stackoverflow.com/questions/7054972/...
Dafka

উত্তর:


282

নিম্নলিখিত বিকল্পগুলি কনসোলে সমস্ত যোগাযোগের লগিং সক্ষম করে (প্রযুক্তিগতভাবে, আপনার কেবলমাত্র এর মধ্যে একটি প্রয়োজন, তবে এটি আপনার ব্যবহৃত লাইব্রেরিগুলির উপর নির্ভর করে, সুতরাং চারটি সেট করা নিরাপদ বিকল্প)। আপনি উদাহরণে যেমন কোডে সেট করতে পারেন, বা কমান্ড লাইন প্যারামিটার হিসাবে -D ব্যবহার করে বা উপেন্দ্র লিখেছেন তেমন পরিবেশ পরিবর্তনশীল হিসাবে।

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");
System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dumpTreshold", "999999");

বিশদের জন্য ত্রুটি দেখা দিলে JAX-WS এর সাথে প্রশ্ন ট্র্যাকিং এক্সএমএল অনুরোধ / প্রতিক্রিয়াগুলি দেখুন।


7
ধন্যবাদ, এই সমস্যার উত্তর আমি খুঁজে পেয়েছি
এম স্মিথ

5
এটি ক্লিমেট টমক্যাটে চালিত হলে আমার পক্ষে কাজ করে না। শুধুমাত্র -ডি স্টাফ কাজ করে। আমি বিশ্বাস করি এটি টমকটের ক্লাসলডার-কাঠামোর কারণে?
রোপ

3
System.setProperty ("com.sun.xML.intern.ws.transport.http.client.HttpTransportPipe.dump", "সত্য"); জ্যাকস-ডাব্লুএস ২.২ আরআইটি জেডিকে 7 এ বান্ডিল করা হয়েছে এবং এটি ডিফল্টরূপে ব্যবহৃত হয়েছে
গ্লেন বেচ

1
টমক্যাটে এই কাজের জন্য আপনাকে এই কমান্ডগুলি জাভা_ওপিটিএসে ক্যাটালিনা.শগুলিতে যুক্ত করতে হবে যেমন প্রথম লাইনে যুক্ত করুন: JAVA_OPTS = "-Dcom.sun.xML.ws.transport.http.client.HttpTransportPipe.dump = true -Dcom। sun.xML.intern.ws.transport.http.client.HttpTransportPipe.dump = সত্য -Dcom.sun.xML.ws.transport.http.HttpAdapter.dump = সত্য -Dcom.sun.xml.intern.ws.transport। http.HttpAdapter.dump = true "এর পরে আপনি catalina.out পরীক্ষা করতে পারেন এবং এটি থেকে আউটপুট সেখানে প্রদর্শিত হবে।
রিস করুন

4
এছাড়াও System.setProperty যুক্ত করুন ("com.sun.xml.intern.ws.transport.http.HttpAdapter.dumpTreshold", "999999"); অনুরোধ এবং প্রতিক্রিয়া আউটপুট কেটে না
বিটমে

84

কাঁচা কোডে সমাধানটি এখানে দেওয়া হয়েছে (একসাথে স্টজোনরো এবং শমিককে ধন্যবাদ জানাতে):

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);
        }
    }
}

8
: যদি আপনি এখনও উপরে কোড সহ প্রতিক্রিয়া / অনুরোধ XML দেখতে না লিঙ্কটি দেখুন stackoverflow.com/questions/2808544/...
ian_scho

2
এটি কোনও SOAPMessage অবজেক্টের অস্তিত্বের উপর নির্ভর করে, তাই যদি আপনি সার্ভার থেকে ত্রুটিযুক্ত প্রতিক্রিয়া পান তবে এটি ব্যর্থ হবে (কেবল একটি ব্যতিক্রম মুদ্রণ করুন, তবে ট্রেস নয়)। আমার উত্তরটি পরীক্ষা করে দেখুন, থাইঞ্জগুলি ভুল হয়ে যাওয়ার পরেও যদি আপনার কোনও ট্রেস দরকার হয়।
মিঃ নাপিক

উপরের স্নিপেটে: শেষ লাইনটি সম্পর্কে ep.publish(publishURL);: কী publishURL(আমার কোডে ডাব্লুএসডিএল ইউআরএলটি সেবার মধ্যেই অন্তর্ভুক্ত রয়েছে; আমার বাইরে কোনও ইউআরএল নেই) আমি কী মিস করছি?)
ব্রেডেরা

আপনি যদি এটি সমস্ত ইন্টারফেসে প্রকাশ করতে চান তবে প্রকাশনাটি হ'ল কিছু (hltp = http): "এইচএলটিপি: //0.0.0.0: 8080 / স্ট্যান্ড্যালোন / পরিষেবা"। এই বিশেষ ক্ষেত্রে, আপনি "hltp: //127.0.0.1: 8080 / স্ট্যান্ডেলোন / পরিষেবা / তোমারসেবা" এ পরিষেবাটি অ্যাক্সেস করতে পারবেন যেখানে "আপনার সার্ভিস" ডাব্লুএসডিএল-তে সংজ্ঞায়িত ডাব্লুএসডিএল পোর্ট অবস্থান।
ঝুঁকিপূর্ণ

@ মিঃনাপিক: তবে আপনি এখনও নিজের লগিং সুবিধা সরবরাহ করতে পারেন, যা আপনি যখন লগিং ফ্রেমওয়ার্ক ব্যবহার করেন তখন দুর্দান্ত।
ড্যানিয়েল

54

টমক্যাট শুরু করার আগে, JAVA_OPTSলিনাক্স এনভিএস-এ নীচে হিসাবে সেট করুন । তারপরে টমক্যাট শুরু করুন। আপনি catalina.outফাইলটিতে অনুরোধ এবং প্রতিক্রিয়া দেখতে পাবেন ।

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

3
উজ্জ্বল। এটি সেরা উত্তর আইএমএইচও।
পাবলো সান্তা ক্রুজ

কোনও কারণে, আমার জন্য এটি:-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
টিবো

কোনও কারণে, এটি আমার 3 টি ওয়েব পরিষেবার মধ্যে একটিতে কাজ করেছে (আমার টমক্যাট ওয়েব-অ্যাপে 3 টি জ্যাক-ডাব্লুএস ওয়েব পরিষেবা রয়েছে)। কোনও ধারণা কেন এটি 3 এ কাজ করবে না?
ডেভিড ব্রসার্ড

আমার পরীক্ষা কেন ব্যর্থ হয়েছে তা দেখার জন্য আমার পক্ষে কঠোর পরিশ্রম হয়েছে (আমার পরীক্ষার 'রান কনফিগারেশন' বিকল্পটি 'ভিএম যুক্তি হিসাবে' সেট করুন)।
মিঃ স্মিথ 42

আপনি সায়ার সবেমাত্র সর্বোত্তম উত্তরের সাথে ইন্টারনেটটি শোষণ করেছেন
ভাইকিংস্টিভ

16

নিম্নলিখিত সিস্টেম বৈশিষ্ট্য সেট করুন, এটি এক্সএমএল লগিং সক্ষম করবে। আপনি এটি জাভা বা কনফিগারেশন ফাইলে সেট করতে পারেন।

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");
        System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dumpTreshold", "999999");
    }

কনসোল লগগুলি:

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
--------------------------------------

14

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) {
    }

}

আমি ঠিক এই অনুসরণ করছি। আমি শিরোনামে পরিবর্তন করার পরে বার্তাটি মুদ্রণ করছি, তবে আমি এই পরিবর্তনগুলি দেখছি না। এটি প্রদর্শিত হয় যেন বার্তাটি হ্যান্ডেল ম্যাসেজ পদ্ধতি ছাড়ার আগ পর্যন্ত পরিবর্তন হয় না
Iofacture

আমি যদি বার বার মুদ্রণ করতে কল করি তবে দ্বিতীয় বারের আপডেট রয়েছে has খুব বিজোড়
আইওফ্যাকচার 29:25

11

অন্যান্য উত্তরগুলিতে বর্ণিত হিসাবে প্রোগ্রামযুক্তভাবে এটি করার বিভিন্ন উপায় রয়েছে তবে তারা বেশ আক্রমণাত্মক প্রক্রিয়া। তবে, আপনি যদি জানেন যে আপনি জ্যাকস-ডাব্লুএস আরআই (ওরফে "মেট্রো") ব্যবহার করছেন, তবে আপনি এটি কনফিগারেশন স্তরে করতে পারেন। এটি কীভাবে করতে হয় তার নির্দেশাবলীর জন্য এখানে দেখুন । আপনার অ্যাপ্লিকেশনটি নিয়ে গোলমাল করার দরকার নেই।


2
মেট্রো = জ্যাকস-ডাব্লুএস আরআই + ডাব্লুএসআইটি (যেমন জ্যাক্স-ডাব্লুএস আরআই! = মেট্রো)
পাস্কেল থিভেন্ট

@ পাউ: স্থির। আপনি জানেন, এজন্য আমাকে ভোট দেওয়ার পরিবর্তে আপনি কিছুটা চেষ্টা করতে পারেন এবং বিকল্প লিঙ্কটি দেওয়ার পরামর্শ দিতে পারেন।
স্কাফম্যান

1
যদি আমি একটি খুঁজে পেয়েছি, নিশ্চিত আমি এটি রাখা হয়েছে। এটি ব্যক্তিগত হিসাবে গ্রহণ করবেন না। ভোট সরিয়ে;)
পাউ

লিঙ্কটি আবার ভেঙে গেছে (জাভা ডটনে কি হবে ???) ??? আমি মনে করি এটি নতুন লিঙ্ক: metro.java.net/nonav/1.2/guide/Logging.html
sdoca

9

// এই সমাধানটি এক্সএমএল কনফিগারে ওয়েব সার্ভিস ক্লায়েন্টে একটি হ্যান্ডলার যুক্ত করে প্রোগ্রামের মাধ্যমে সরবরাহ করে

// সম্পূর্ণ ডকটি এখানে দেখুন: http://docs.oracle.com/cd/E17904_01//web.1111/e13734/handlers.htm#i222476

// নতুন ক্লাস তৈরি করুন যা এসওএপিএইচ্যান্ডলার প্রয়োগ করে

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);

4

আমি একটি নতুন উত্তর পোস্ট করছি, যেহেতু অ্যান্টোনিওর সরবরাহকৃত বিষয়ে মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই (দেখুন: https://stackoverflow.com/a/1957777 )।

আপনি যদি চান যে কোনও ফাইলের মধ্যে এসওএপি বার্তা মুদ্রিত হয় (উদাহরণস্বরূপ লোগোজেজে), আপনি এটি ব্যবহার করতে পারেন:

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://commune.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());

2

আপনাকে একটি জাভ্যাক্স.এক্সএমএল.ইজ.হ্যান্ডলারের লজিক্যাল হ্যান্ডলার বাস্তবায়ন করতে হবে, এই হ্যান্ডলারটি হ্যান্ডলারের কনফিগারেশন ফাইলে রেফারেন্স করা দরকার, যা আপনার সার্ভিস এন্ডপয়েন্টে (ইন্টারফেস বা বাস্তবায়ন) @ হ্যান্ডলারচেইন টীকা দ্বারা রেফারেন্স করা হয়। তারপরে আপনি সিস্টেমটি.আউটের মাধ্যমে বার্তাটি আউটপুট করতে পারেন বা আপনার প্রক্রিয়ামেজ বাস্তবায়নে লগার ger

দেখা

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


2

এখানে তালিকাভুক্ত উত্তরগুলি যা আপনাকে ব্যবহার SOAPHandlerকরতে গাইড করে তা সম্পূর্ণ সঠিক। এই পদ্ধতির সুবিধা হ'ল এটি যে কোনও জ্যাক্স-ডাব্লুএস বাস্তবায়নের সাথে কাজ করবে, কারণ এসওএপিএইচএন্ডহ্যান্ডলার জ্যাক-ডাব্লুএস স্পেসিফিকেশনের অংশ। তবে এসওএপিএইচএন্ডল্যান্ডারের সমস্যাটি হ'ল এটি স্পষ্টভাবে মেমোরিটিতে পুরো এক্সএমএল বার্তাটি উপস্থাপন করার চেষ্টা করে। এটি বিশাল স্মৃতি ব্যবহারের দিকে নিয়ে যেতে পারে। জ্যাক্স-ডাব্লুএস এর বিভিন্ন বাস্তবায়ন এর জন্য তাদের নিজস্ব কর্মসীমা যুক্ত করেছে। আপনি যদি বড় অনুরোধ বা বৃহত্তর প্রতিক্রিয়া নিয়ে কাজ করেন, তবে আপনাকে মালিকানাধর্মী একটি পদ্ধতির মধ্যে নজর দেওয়া দরকার।

যেহেতু আপনি "জেডিকে ১.৫ বা তার চেয়ে ভাল এর মধ্যে অন্তর্ভুক্ত রয়েছে" সম্পর্কে জিজ্ঞাসা করেছেন তাই আমি জ্যাকস-ডাব্লুএস আরআই (ওরফে মেট্রো) যা জেডিকে অন্তর্ভুক্ত রয়েছে সেটিকেই আনুষ্ঠানিকভাবে জবাবদিহি করব।

জ্যাকস-ডাব্লুএস আরআইয়ের এর জন্য একটি নির্দিষ্ট সমাধান রয়েছে যা মেমরির ব্যবহারের ক্ষেত্রে অত্যন্ত দক্ষ।

Https://javaee.github.io/metro/doc/user-guide/ch02.html#eype-handlers-in-jax-ws-ri দেখুন । দুর্ভাগ্যক্রমে সেই লিঙ্কটি এখন ভেঙে গেছে তবে আপনি এটি ওয়েব্যাক মেশিনে খুঁজে পেতে পারেন। আমি নীচে হাইলাইটগুলি দেব:

২০০ 2007 সালে ফিরে মেট্রো লোকেরা একটি অতিরিক্ত হ্যান্ডলারের ধরণের প্রবর্তন করেMessageHandler<MessageHandlerContext> , যা মেট্রোর মালিকানাধীন। এটি SOAPHandler<SOAPMessageContext>মেমোরি ডিওএম প্রতিনিধিত্ব করার চেষ্টা করে না বলে এটি আরও কার্যকর ।

মূল ব্লগ নিবন্ধ থেকে গুরুত্বপূর্ণ পাঠ্য এখানে:

MessageHandler:

জ্যাকস-ডাব্লুএস স্পেসিফিকেশন এবং আরআই-র আরও ভাল বার্তা বিমূর্ততা সরবরাহ করে এক্সটেনসিবল হ্যান্ডলার কাঠামোটি ব্যবহার করে আমরা MessageHandlerআপনার ওয়েব পরিষেবা অ্যাপ্লিকেশনগুলি প্রসারিত করার জন্য ডেকে একটি নতুন হ্যান্ডলার প্রবর্তন করেছি । মেসেজহ্যান্ডলারটি এসওএপিএইচএন্ডলারের অনুরূপ, এর বাস্তবায়নগুলি অ্যাক্সেস পায়MessageHandlerContext(মেসেজকন্টেক্সট এক্সটেনশন)। ম্যাসেজহ্যান্ডলারকন্টেক্সটের মাধ্যমে যে কোনও ব্যক্তি বার্তা অ্যাক্সেস করতে পারে এবং বার্তা এপিআই ব্যবহার করে এটি প্রক্রিয়া করতে পারে। আমি যেমন ব্লগের শিরোনামে রেখেছি, এই হ্যান্ডলারটি আপনাকে বার্তায় কাজ করতে দেয়, যা কেবলমাত্র কোনও ডিওএম ভিত্তিক বার্তা নয় বার্তাটি অ্যাক্সেস / প্রক্রিয়া করার কার্যকর উপায় সরবরাহ করে। হ্যান্ডলারের প্রোগ্রামিং মডেলটি একই এবং বার্তা হ্যান্ডলারগুলি স্ট্যান্ডার্ড লজিকাল এবং এসওএপি হ্যান্ডলারগুলির সাথে মিশ্রিত করা যায়। আমি জ্যাক্স-ডাব্লুএস আরআই ২.১.৩ এ একটি নমুনা যুক্ত করেছি যাতে বার্তাগুলি লগ করতে বার্তা হ্যান্ডলারের ব্যবহার দেখানো হয় এবং এখানে নমুনার একটি স্নিপেট রয়েছে:

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উদাহরণস্বরূপ, কোনও প্রভাব ফেলতে আপনার হ্যান্ডলার চেইনে যুক্ত করা দরকার। এটি অন্য Handlerযে কোনও যুক্ত করার মতোই , সুতরাং কীভাবে এটি করা যায় তার জন্য আপনি এই পৃষ্ঠার অন্যান্য উত্তরগুলি সন্ধান করতে পারেন ।

আপনি একটি জানতে পারেন পূর্ণ উদাহরণস্বরূপ মধ্যে মেট্রো GitHub রেপো


1

আপনি ওয়েব ServletFilterসার্ভিসের সামনে একটি আবেদন রাখার অনুরোধ এবং প্রতিক্রিয়াটি পরিষেবা থেকে ফিরে / ফিরে যাবার চেষ্টা করতে পারেন ।

যদিও আপনি বিশেষত প্রক্সি চেয়েছিলেন না, কখনও কখনও আমি দেখতে পাই যে সংযোগে কী চলছে তা দেখার জন্য tcptrace যথেষ্ট। এটি একটি সহজ সরঞ্জাম, কোনও ইনস্টল নেই, এটি ডেটা স্ট্রিমগুলি দেখায় এবং ফাইলটিতেও লিখতে পারে।


1

ইন রানটাইম আপনি কেবল চালানো পারে

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

যেমন ডাম্প একটি পাবলিক Var বর্গ সংজ্ঞায়িত নিম্নরূপ

public static boolean dump;

আমার জন্য com.sun.xML.ws.transport.http.client.HttpTransportPipe.dump = সত্যের সাথে কাজ করুন;
ইউজারএফবি

1

আমি কি বুঝতে পেরেছি যে আপনি কাঁচা এক্সএমএল বার্তাটি পরিবর্তন / অ্যাক্সেস করতে চান?

যদি তা হয় তবে আপনার (বা যেহেতু এটি পাঁচ বছর বয়সী, পরের লোকটি) জ্যাকএক্সডাব্লুএসের অংশ যা সরবরাহকারী ইন্টারফেসটি দেখতে চান। ক্লায়েন্টের অংশটি "ডিসপ্যাচ" ক্লাস ব্যবহার করে সম্পন্ন করা হয়। যাইহোক, আপনাকে হ্যান্ডলার বা ইন্টারসেপ্টর যুক্ত করতে হবে না। আপনি এখনও অবশ্যই পারেন। নেতিবাচক দিকটি এইভাবে, আপনি 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;}


   }
}

আপনি এটি SEI মত প্রকাশ করেন,

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);
}
}

অথবা আপনি এটির জন্য একটি এন্ডপয়েন্ট প্লে ক্লাস ব্যবহার করতে পারেন। আশা করি যে সহায়ক হয়েছে।

এবং ওহ, আপনি যদি চান যে আপনার শিরোনাম এবং স্টাফগুলির সাথে ডিলের দরকার নেই, যদি আপনি পরিষেবা মোডটিকে পেইলএডে পরিবর্তন করেন (আপনি কেবলমাত্র সাবান বডি পাবেন)।


1

লগব্যাক.এক্সএমএল কনফিগারেশন ফাইলগুলির সাহায্যে আপনি এটি করতে পারেন:

<logger name="com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe" level="trace" additivity="false">
    <appender-ref ref="STDOUT"/>
</logger>

এটি অনুরোধ এবং এর মতো প্রতিক্রিয়া লগ করবে (লগ আউটপুট জন্য আপনার কনফিগারেশনের উপর নির্ভর করে):

09:50:23.266 [qtp1068445309-21] DEBUG c.s.x.i.w.t.h.c.HttpTransportPipe - ---[HTTP request - http://xyz:8081/xyz.svc]---
Accept: application/soap+xml, multipart/related
Content-Type: application/soap+xml; charset=utf-8;action="http://xyz.Web.Services/IServiceBase/GetAccessTicket"
User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
<?xml version="1.0" ?><S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">[CONTENT REMOVED]</S:Envelope>--------------------

09:50:23.312 [qtp1068445309-21] DEBUG c.s.x.i.w.t.h.c.HttpTransportPipe - ---[HTTP response - http://xyz:8081/xyz.svc - 200]---
null: HTTP/1.1 200 OK
Content-Length: 792
Content-Type: application/soap+xml; charset=utf-8
Date: Tue, 12 Feb 2019 14:50:23 GMT
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">[CONTENT REMOVED]</s:Envelope>--------------------

1

আমি কয়েক দিনের জন্য ওয়েব পরিষেবা সাবান অনুরোধ এবং প্রতিক্রিয়া লগ করতে কিছু ফ্রেমওয়ার্ক গ্রন্থাগার সন্ধান করার চেষ্টা করছিলাম। নীচের কোডটি আমার জন্য সমস্যাটি স্থির করেছে:

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");

0

করার একটি উপায় হ'ল আপনার কোডটি ব্যবহার না করে ইথেরাল বা ওয়্যারশার্কের মতো নেটওয়ার্ক প্যাকেট স্নিফার ব্যবহার করুন যা এইচটিপিপি প্যাকেটটিকে এক্সএমএল বার্তার সাথে পেডলোড হিসাবে ক্যাপচার করতে পারে এবং আপনি এগুলিকে কোনও ফাইল বা লগইন করতে পারেন।

তবে আরও পরিশীলিত পন্থা হ'ল আপনার নিজের বার্তা হ্যান্ডলারগুলি লিখুন। আপনি এটি এখানে একবার তাকান করতে পারেন ।


0

বাস্তবিক। আপনি যদি HTTPClientTransport এর উত্সগুলি লক্ষ্য করেন তবে আপনি খেয়াল করবেন যে এটি java.util.logging.Logger এ বার্তাও লিখছে। যার অর্থ আপনি আপনার লগগুলিতেও এই বার্তাগুলি দেখতে পাচ্ছেন।

উদাহরণস্বরূপ আপনি যদি লগ 4 জ 2 ব্যবহার করছেন তবে আপনার যা করতে হবে তা হ'ল:

  • আপনার শ্রেণীর পথে JUL-Log4J2 ব্রিজ যুক্ত করুন
  • com.sun.xML.intern.ws.transport.http.client প্যাকেজের জন্য ট্র্যাক স্তর নির্ধারণ করুন।
  • আপনার আবেদনকারীর কমান্ড লাইনের প্রারম্ভিক সিস্টেমের সম্পত্তি যুক্ত করুন

এই পদক্ষেপগুলির পরে আপনি আপনার লগগুলিতে এসওএপি বার্তা দেখতে শুরু করেন।


0

এই থ্রেডে সোপহ্যান্ডলারগুলি ব্যবহার করে বেশ কয়েকটি উত্তর রয়েছে। আপনার জানা উচিত যে সোপহ্যান্ডার্স কল করা হলে বার্তাটি পরিবর্তন করে writeTo(out)

SOAPMessage এর writeTo(out)পদ্ধতিটি কল করা স্বয়ংক্রিয়ভাবে saveChanges()পদ্ধতিতেও কল করে । ফলস্বরূপ একটি বার্তায় থাকা সমস্ত সংযুক্ত এমটিওএম / এক্সওপি বাইনারি ডেটা হারিয়ে যায়।

কেন এটি হচ্ছে তা আমি নিশ্চিত নই, তবে এটি একটি নথিযুক্ত বৈশিষ্ট্য বলে মনে হচ্ছে।

তদ্ব্যতীত, এই পদ্ধতিটি সেই বিন্দুটিকে চিহ্নিত করে যেখানে সমস্ত উপাদান সংযুক্তি অ্যাটাকমেন্টপার্ট অবজেক্ট থেকে ডেটা বার্তায় টানা হয়।

https://docs.oracle.com/javase/7/docs/api/javax/xml/soap/SOAPMessage.html#saveChanges ()


0

যদি আপনি কোনও আইবিএম লিবার্টি অ্যাপ্লিকেশন সার্ভার চালানোর জন্য ঘটে থাকেন তবে কেবল ওয়েবে -আইএনএফ ডিরেক্টরিতে আইবিএম -ডাব্লু-বিএনএস.এমএমএল যুক্ত করুন

<?xml version="1.0" encoding="UTF-8"?>
<webservices-bnd
    xmlns="http://websphere.ibm.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ws-bnd_1_0.xsd"
    version="1.0">
    <webservice-endpoint-properties
        enableLoggingInOutInterceptor="true" />
</webservices-bnd>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.