JAX-WS ile XML isteğini / yanıtlarını izleme


172

JAX-WS referans uygulamasıyla (JDK 1.5 ve daha iyisi dahil) yayınlanan bir web hizmeti için ham istek / yanıt XML'sine erişmek için kolay bir yol var mı (aka: proxy kullanmamak)? Bunu kodla yapabilmek için ne yapmam gerekiyor. Sadece akıllı günlük yapılandırmalarıyla bir dosyaya giriş yapmak güzel ama yeterli olurdu.

Bunu yapabilen daha karmaşık ve eksiksiz çerçevelerin var olduğunu biliyorum, ancak mümkün olduğunca basit tutmak istiyorum ve eksen, cxf, vb.

Teşekkürler!


5
Sadece bir not: JAX-WS, CXF'nin uyguladığı bir standarttır.
Bozho

Java sistem özelliklerini ve ortam değişkenlerini ayarlama bkz: <br> stackoverflow.com/questions/7054972/…
Dafka

Yanıtlar:


282

Aşağıdaki seçenekler, tüm iletişimin konsola kaydedilmesini sağlar (teknik olarak bunlardan yalnızca birine ihtiyacınız vardır, ancak bu kullandığınız kitaplıklara bağlıdır, bu nedenle dördünün de ayarlanması daha güvenlidir). Örneğin gibi kodda veya -D kullanarak komut satırı parametresi olarak veya Upendra'nın yazdığı gibi ortam değişkeni olarak ayarlayabilirsiniz.

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

Ayrıntılar için hata oluştuğunda JAX-WS ile XML isteğini / yanıtlarını izleme sorusuna bakın .


7
Teşekkürler, bu soruna bulduğum en iyi cevap bu
M Smith

5
MÜŞTERİ Tomcat'te çalıştığında bu benim için çalışmaz. Sadece -D işleri işe yarar. Bunun Tomcat'teki classLoader yapısından kaynaklandığına inanıyorum?
Rop

3
System.setProperty ("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "doğru"); JDK7'de paketlenmiş ve varsayılan olarak kullanılan JAX-WS 2.2 RI için doğru olanıdır
Glenn Bech

1
tomcat'teki bu çalışma için bu komutları catalina.sh içindeki JAVA_OPTS dosyasına eklemeniz gerekir, örneğin ilk satırda ekleyin: JAVA_OPTS = "-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump = true -Dcom. sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump = true -Dcom.sun.xml.ws.transport.http.HttpAdapter.dump = true -Dcom.sun.xml.internal.ws.transport. http.HttpAdapter.dump = true "Bundan sonra catalina.out dosyasını kontrol edebilirsiniz ve bundan çıktı orada gösterilir.
Reece

4
Ayrıca System.setProperty ("com.sun.xml.internal.ws.transport.http.HttpAdapter.dumpTreshold", "999999") ekleyin; istek ve yanıt çıktısının kesilmemesi
8bitme

84

İşte ham koddaki çözüm (stjohnroe ve Shamik sayesinde bir araya getirilir):

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

SOAPLoggingHandler (bağlı örneklerden kopyalanır) olduğu yerde:

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
Yukarıdaki kodla hala yanıt / istek
xml'yi

2
Bu bir SOAPMessage nesnesinin varlığına dayanır, bu nedenle sunucudan hatalı biçimlendirilmiş yanıt alırsanız başarısız olur (yalnızca bir istisna yazdırır, ancak iz değil). İşler yanlış gittiğinde bile bir izlemeye ihtiyacınız varsa cevabımı kontrol edin.
Bay Napik

En üstteki snippet'te: son satırla ilgili ep.publish(publishURL);: nedir publishURL(Kodumda, wsdl url hizmetin kendisine dahil edilmiştir; dışında herhangi bir
url'im

Tüm arayüzde yayınlamak istiyorsanız, publishUrl şöyle bir şeydir (hltp = http): "hltp: //0.0.0.0: 8080 / bağımsız / hizmet". Bu özel durumda, hizmete "hltp: //127.0.0.1: 8080 / bağımsız / service / yourService" adresinden erişebilirsiniz; burada "hizmetiniz", wsdl'de tanımlanan wsdl bağlantı noktası konumudur.
riskop

@ Mr.Napik: Ancak bu şekilde yine de bir günlük kaydı çerçevesi kullandığınızda iyi olan kendi günlük kaydı tesisinizi sağlayabilirsiniz.
Daniel

54

JAVA_OPTSTomcat'e başlamadan önce Linux envs'de aşağıdaki gibi ayarlayın . Sonra Tomcat'i başlatın. catalina.outDosyada istek ve yanıtı göreceksiniz .

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

3
Parlak. Bu en iyi cevap IMHO.
Pablo Santa Cruz

Bazı nedenlerden dolayı, benim için:-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
tibo

Bazı nedenlerden dolayı, bu benim 3 web servisimden sadece birinde çalıştı (Tomcat web uygulamamda 3 JAX-WS web servisim var). Neden 3'te işe yaramayacağı hakkında bir fikrin var mı?
David Brossard

Testimin neden başarısız olduğunu görmek benim için iyi çalıştı (Testimin 'yapılandırmasını çalıştır' seçeneğini 'VM argümanı' olarak ayarlayın).
MrSmith42

Sire şimdiye kadarki en iyi cevapla interneti
patlattınız

16

Aşağıdaki sistem özelliklerini ayarlayın, bu xml günlük kaydını etkinleştirir. Java veya yapılandırma dosyasında ayarlayabilirsiniz.

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

konsol günlükleri:

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

SOAPHandlerUç nokta arayüzüne enjekte edin . SOAP isteğini ve yanıtını izleyebiliriz

İle Uygulama SOAPHandler Programlı

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

Declarative ekleyerek @HandlerChain(file = "handlers.xml")uç nokta arayüzüne ek açıklama.

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

}

Bunu tam olarak takip ediyorum. Ben başlıkta değişiklikler yaptıktan sonra mesaj yazdırıyorum, ancak bu değişiklikleri görmüyorum. İleti, handleMessage yönteminden ayrılıncaya kadar değişmiyormuş gibi görünüyor
Iofacture

İletiyi iki kez yazdırmak için çağırırsam, ikinci kez güncelleme yapılır. Çok garip
Iofacture

11

Bunu diğer cevaplarda açıklandığı gibi programlı olarak yapmanın çeşitli yolları vardır, ancak bunlar oldukça invaziv mekanizmalardır. Ancak, JAX-WS RI ("Metro" olarak da bilinir) kullandığınızı biliyorsanız, bunu yapılandırma düzeyinde yapabilirsiniz. Bunun nasıl yapılacağıyla ilgili talimatlar için buraya bakın . Uygulamanızla uğraşmanıza gerek yok.


2
Metro = JAX-WS RI + WSIT (yani JAX-WS RI! = Metro)
Pascal Thivent

@Pau: Sabit. Bilirsiniz, bunun için bana oy vermek yerine, biraz çaba harcayabilir ve alternatif bir bağlantı önerebilirsiniz.
skaffman

1
Bir tane bulsaydım, koyacağımdan emin ol. Kişisel olarak kabul etmeyin. oy kaldırıldı;)
Pau

Bağlantı tekrar koptu (java.net'te ne var ???). Bence bu yeni bağlantı: metro.java.net/nonav/1.2/guide/Logging.html
sdoca

9

// Bu çözüm, XML yapılandırma olmadan web hizmeti istemcisine programlı olarak bir işleyici ekleme yolu sağlar

// Dokümanın tamamını buradan görebilirsiniz: http://docs.oracle.com/cd/E17904_01//web.1111/e13734/handlers.htm#i222476

// SOAPHandler uygulayan yeni sınıf oluşturma

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

// LogMessageHandler'ınızı programlı olarak ekleyin

   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

Antonio tarafından sağlanan soru hakkında yorum yapmak için yeterli üne sahip olmadığım için yeni bir cevap gönderiyorum (bkz: https://stackoverflow.com/a/1957777 ).

SOAP mesajının bir dosyada yazdırılmasını istiyorsanız (örn. Log4j aracılığıyla), şunları kullanabilirsiniz:

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

Belirli durumlarda, writeTo () yönteminin beklendiği gibi davranmayabileceğini unutmayın (bkz: https://community.oracle.com/thread/1123104?tstart=0 veya https://www.java.net/node / 691073 ), bu nedenle aşağıdaki kod işe yarayacaktır:

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

Bir javax.xml.ws.handler.LogicalHandler uygulamanız gerekir, bu işleyiciye daha sonra bir işleyici yapılandırma dosyasında başvurulması gerekir; Daha sonra iletiyi system.out aracılığıyla veya processMessage uygulamanızdaki bir günlükçüyle çıktısını alabilirsiniz.

Görmek

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

Burada listelenen ve sizi yönlendiren cevaplar SOAPHandlertamamen doğrudur. Bu yaklaşımın yararı, SOAPHandler JAX-WS spesifikasyonunun bir parçası olduğu için herhangi bir JAX-WS uygulamasıyla çalışacak olmasıdır. Ancak, SOAPHandler ile ilgili sorun, dolaylı olarak tüm XML iletisini bellekte göstermeye çalışmasıdır. Bu, büyük bellek kullanımına yol açabilir. JAX-WS'nin çeşitli uygulamaları bunun için kendi geçici çözümlerini ekledi. Büyük talepler veya büyük yanıtlarla çalışıyorsanız, özel yaklaşımlardan birine bakmanız gerekir.

"JDK 1.5 veya daha iyisine dahil olan" hakkında soru sorduğunuzdan, resmi olarak JDK'da bulunan JAX-WS RI (aka Metro) olarak bilinen şeyle ilgili olarak cevap vereceğim.

JAX-WS RI bunun için bellek kullanımı açısından çok verimli olan özel bir çözüme sahiptir.

Bkz. Https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . Maalesef bu bağlantı koptu ancak WayBack Machine'de bulabilirsiniz. Aşağıda vurgulayacağım:

2007'de Metro halkı, Metro'ya ait ek bir işleyici türü tanıttıMessageHandler<MessageHandlerContext> . SOAPHandler<SOAPMessageContext>Bellek içi DOM gösterimi yapmaya çalışmadığından çok daha verimlidir .

İşte orijinal blog makalesindeki önemli metin:

messageHandler:

JAX-WS Spesifikasyonu tarafından sağlanan genişletilebilir İşleyici çerçevesini ve RI'da daha iyi İleti soyutlamasını MessageHandlerkullanarak, Web Hizmeti uygulamalarınızı genişletmek için adlandırılan yeni bir işleyici tanıttık . MessageHandler, SOAPHandler uygulamasına benzer, ancak uygulamalarına erişilmesi dışındaMessageHandlerContext(MessageContext'in bir uzantısı). MessageHandlerContext aracılığıyla Mesaj'a erişebilir ve Mesaj API'sını kullanarak işleyebilir. Blog başlığına koyduğum için, bu işleyici Mesaj üzerinde çalışmanıza izin verir, bu da sadece DOM tabanlı bir mesaja değil, mesaja erişmek / işlemek için etkili yollar sağlar. İşleyicilerin programlama modeli aynıdır ve Message işleyicileri standart Logical ve SOAP işleyicileri ile karıştırılabilir. JAX-WS RI 2.1.3'te iletileri günlüğe kaydetmek için MessageHandler kullanımını gösteren bir örnek ekledim ve işte örnekten bir snippet:

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 blog yazısından alıntı)

Söylemeye gerek yok, özel işleyicinizin LoggingHandlerherhangi bir etkisi olması için işleyici zincirinize eklenmesi gerekir. Bu, başkalarını eklemekle aynıdır Handler, bu yüzden nasıl yapılacağı hakkında bu sayfadaki diğer cevaplara bakabilirsiniz .

Bir bulabilirsiniz tam bir örnek de Metro GitHub repo .


1

Web hizmetinin ServletFilterönüne bir koyup hizmete giden / hizmetten dönen istek ve yanıtları inceleyebilirsiniz.

Özellikle proxy istemediğiniz halde, bazen tcptrace'in bir bağlantıda neler olduğunu görmek için yeterli olduğunu düşünüyorum. Basit bir araç, kurulum yok, veri akışlarını gösteriyor ve dosyaya da yazabiliyor.


1

In zamanında sadece yürütebilir

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

olarak dökümü aşağıdaki gibidir sınıf içerisinde tanımlanan bir public var olduğunu

public static boolean dump;

Benim için com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump = true;
userfb

1

ham XML iletisini değiştirmek / erişmek istediğinizi anlıyorum?

Öyleyse, siz (veya bu beş yaşında olduğundan, bir sonraki adam) JAXWS'nin bir parçası olan Sağlayıcı arayüzüne bakmak isteyebilirsiniz. İstemci karşılığı "Dispatch" sınıfı kullanılarak yapılır. Her neyse, işleyici veya önleyici eklemek zorunda değilsiniz. Tabii ki hala yapabilirsin. Dezavantajı bu şekilde, SOAPMessage oluşturmak için TAMAMEN sorumlu, ama kolay, ve eğer istediğiniz gibi (yaptığım gibi) bu mükemmel.

İşte sunucu tarafı için bir örnek (bit beceriksiz, sadece deneme amaçlıydı) -

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


   }
}

Bir SEI gibi yayınlıyorsunuz,

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

Veya bunun için bir Endpoint sınıfı kullanabilirsiniz. Umarım faydalı olmuştur.

Ve oh, isterseniz üstbilgiler ve şeyler ile uğraşmanıza gerek yok, servis modunu PAYLOAD olarak değiştirirseniz (sadece Sabun Gövdesini alacaksınız).


1

logback.xml yapılandırma dosyalarıyla şunları yapabilirsiniz:

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

Bu isteği ve yanıtı şöyle kaydeder (günlük çıktısı için yapılandırmanıza bağlı olarak):

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

Birkaç gün boyunca web hizmeti sabun isteği ve yanıtı günlüğe kaydetmek için bazı çerçeve kütüphane bulmaya çalışıyordum. Aşağıdaki kod benim için sorunu düzeltti:

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

Bunu yapmanın bir yolu, kodunuzu kullanmak değil, Etheral veya WireShark gibi HTTP paketini XML mesajıyla ona yük olarak yakalayabilen ve bunları bir dosyaya kaydetmeye devam edebileceğiniz ağ paketi koklayıcılarını kullanmaktır.

Ancak daha sofistike yaklaşım, kendi mesaj işleyicilerinizi yazmaktır. Burada bir göz atabilirsiniz .


0

Aslında. HttpClientTransport kaynaklarına bakarsanız, bunun da java.util.logging.Logger'a mesaj yazdığını fark edeceksiniz. Yani bu mesajları günlüklerinizde de görebilirsiniz.

Örneğin, Log4J2 kullanıyorsanız yapmanız gereken tek şey şudur:

  • sınıf yolunuza JUL-Log4J2 bridge ekleyin
  • com.sun.xml.internal.ws.transport.http.client paketi için TRACE seviyesini ayarlayın.
  • Uygulama başlangıç ​​komut satırınıza -Djava.util.logging.manager = org.apache.logging.log4j.jul.LogManager sistem özelliğini ekleyin

Bu adımlardan sonra günlüklerinizde SOAP mesajları görmeye başlarsınız.


0

Bu ileti dizisinde SoapHandlers kullanarak birkaç yanıt var. Aşağıdaki durumlarda SoapHandlers'ın mesajı değiştirdiğini bilmelisinizwriteTo(out) .

SOAPMessage writeTo(out)yönteminin çağrılması otomatik olarak çağrılırsaveChanges() da . Sonuç olarak, bir iletideki tüm bağlı MTOM / XOP ikili verileri kaybolur.

Bunun neden olduğundan emin değilim, ancak belgelenmiş bir özellik gibi görünüyor.

Ayrıca, bu yöntem, tüm oluşturucu AttachmentPart nesnelerinden gelen verinin mesaja çekildiği noktayı işaretler.

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


0

IBM Liberty uygulama sunucusu çalıştırıyorsanız, WEB-INF dizinine ibm-ws-bnd.xml dosyasını eklemeniz yeterlidir .

<?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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.