بحاجة إلى رؤية رسائل الصابون للعميل التحدث إلى خدمة الويب الخارجية - كيف؟ (الكسوف / Netbeans / فكرة موافق)

StackOverflow https://stackoverflow.com/questions/2221488

سؤال

لدي موقف يجب أن أكتب عميلا في Java مقابل خدمة ويب خارجية صعبة للغاية (عبر HTTPS) ويمكنني التحدث إلى خدمة الويب من خلال مستكشف خدمات الويب في Eclipse Java EE.

لسوء الحظ، لا يمكنني الحصول على العميل أن أسأل بشكل صحيح حتى أود حقا أن أرى رسائل الصابون جيئة وذهابا. أن تكون جديدا في خدمات الويب هذا قليلا من الغابة. أنا على دراية جدا بالكتف، وقد أمضيت بعض الوقت مع Netbeans و Intellij.

سأفضل ذلك حقا استخدام مكدس المترو لأنه يسمح بذلك بتشغيله على جافا 6، وحجم النشر المسائل. هل هناك طريقة بسيطة لجعل المترو سجل ما يفعله، أو جعله يتحدث من خلال شاشات TCP / IP في الكسوف والشبكي؟ يبدو أن وثائق المترو مستهدفة في المقام الأول في مؤلف خدمة الويب وليس العميل، لذلك قد أفتقدها بسهولة.

أي اقتراحات لإعداد القول "هنا هو WSDL - إنشاء عميل لي حيث يمكنني رؤية حركة المرور"؟

هل كانت مفيدة؟

المحلول 3

كان من المفيد تشغيل تسجيل

-Dcom.sun.xml.ws.assembler.client=true

في تكوين الإطلاق Eclipse.

نصائح أخرى

فقط ضع وكيل أو شاشة TCP "في الوسط" وسترى الرسالة.

لقد كنت تستخدم Tcpmon. لمهمة مماثلة.

فيما يلي طريقة أخرى لمراقبة رسائل الصابون:

يبدو أن يفترض فئات العميل التي تم إنشاؤها:

// generated service class
public class MyWebServiceClient extends javax.xml.ws.Service {
    // ...
    private final QName portName = "...";
    // ...
    public RetrieveMyObjects getRetrieveMyObjects() {
        return super.getPort(portName, RetrieveMyObject.class);
    }
    // ...
}

// generated port interface
// annotations here
public interface RetrieveMyObjects {

    // annotations here
    List<MyObject> getAll();

}

الآن، عند تنفيذ التعليمات البرمجية التالية:

MyWebServiceClient wsClient = new MyWebServiceClient("wsdl/location/url/here.wsdl");
RetrieveMyObjectsPort retrieveMyObjectsPort = wsClient.getRetrieveMyObjects();

wsClient يجب إرجاع المثيل الذي هو مثيل RetrieveMyObjects & javax.xml.ws.BindingProvider واجهات. لم يتم ذكره في أي مكان على سطح JAX-WS، ولكن يبدو أن الكثير من التعليمات البرمجية يعتمد على تلك الحقيقة. يمكن للمرء إعادة تأكيده نفسها عن طريق تنفيذ شيء مثل:

if(!(retrieveMyObjectsPort instanceof javax.xml.ws.BindingProvider)) {
    throw new RuntimeException("retrieveMyObjectsPort is not instance of " + BindingProvider.class + ". Redirect following as well as authentication is not possible");
}

الآن، عندما نتأكد من ذلك retrieveMyObjectsPort هل مثيل javax.xml.ws.BindingProvider يمكننا تمكين SOAPMessage تسجيل من خلال استدعاء الطريقة التالية على كل واجهة منفذ خدمة الويب المطلوبة:

/**
 * Enables logging of send and received SOAP messages on the specified {@link BindingProvider}s
 */
private static void enableSoapMessageLogging(final Logger logger, final BindingProvider... bindingProviders) {
    for(final BindingProvider bindingProvider : bindingProviders) {
        final List<Handler> handlerChain = bindingProvider.getBinding().getHandlerChain();
        handlerChain.add(new SOAPHandler<SOAPMessageContext>() {
            @Override
            public boolean handleMessage(final SOAPMessageContext context) {
                try {
                    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    context.getMessage().writeTo(baos);
                    logger.trace(new String(baos.toByteArray()));
                } catch(final Exception e) {
                    logger.error("", e);
                }
                return true;
            }

            @Override
            public boolean handleFault(final SOAPMessageContext context) {
                return true;
            }

            @Override
            public void close(final MessageContext context) {
            }

            @Override
            public Set<QName> getHeaders() {
                return null;
            }
        });
        bindingProvider.getBinding().setHandlerChain(handlerChain);
    }
}

// and somewhere at the beginning of application ...
enableSoapMessageLogging(logger, (BindingProvider) retrieveMyObjectsPort);

أتمنى أن يساعدك هذا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top