Отслеживание XML-запроса / ответов с помощью JAX-WS

172

Существует ли простой способ (он же не использует прокси-сервер) для получения доступа к необработанному XML-запросу / ответу для веб-службы, опубликованной с эталонной реализацией JAX-WS (той, которая включена в JDK 1.5 и выше)? Я должен делать это с помощью кода. Просто записать его в файл с помощью умных конфигураций регистрации было бы неплохо, но достаточно.

Я знаю, что существуют другие более сложные и полные фреймворки, которые могут это сделать, но я бы хотел, чтобы это было как можно проще, а оси, cxf и т. Д. Все добавляли значительные накладные расходы, которых я хочу избежать.

Спасибо!

Антонио
источник
5
Просто примечание: JAX-WS - это стандарт, который реализует CXF.
Божо
Настройка системных свойств Java и переменных окружения см: <br> stackoverflow.com/questions/7054972/...
Dafka

Ответы:

282

Следующие опции позволяют регистрировать все соединения с консолью (технически вам нужен только один из них, но это зависит от библиотек, которые вы используете, поэтому установка всех четырех параметров безопаснее). Вы можете установить его в коде, как в примере, или как параметр командной строки, используя -D или как переменную окружения, как написал Upendra.

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

Подробности см. В вопросе « Отслеживание XML-запроса / ответов с помощью JAX-WS» при возникновении ошибки .

Мистер напик
источник
7
Спасибо, это лучший ответ, который я нашел на эту проблему
М Смит
5
Это НЕ работает для меня, когда клиент работает в Tomcat. Работает только -D. Я полагаю, это связано с classLoader-структурой в Tomcat?
Rop
3
System.setProperty ("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true"); является правильным для JAX-WS 2.2 RI, встроенного в JDK7 и используемого по умолчанию
Glenn Bech
1
для этой работы в tomcat вам нужно добавить эти команды в JAVA_OPTS в catalina.sh, например, в первой строке добавить: 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 ", после этого вы можете проверить catalina.out, и результат этого будет показан там.
Рис
4
Также добавьте System.setProperty ("com.sun.xml.internal.ws.transport.http.HttpAdapter.dumpTreshold", "999999"); чтобы не было усеченного вывода запроса и ответа
8bitme
84

Вот решение в необработанном коде (собранное благодаря stjohnroe и Shamik):

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(В моем коде URL-адрес wsdl включен в сам сервис; у меня нет URL-
адреса
Если вы хотите опубликовать его на всех интерфейсах, то publishUrl выглядит примерно так (hltp = http): «hltp: //0.0.0.0: 8080 / standalone / service». В этом конкретном случае вы можете получить доступ к службе по адресу «hltp: //127.0.0.1: 8080 / standalone / service / yourService», где «yourService» - это местоположение порта wsdl, определенное в wsdl.
Riskop
@ Mr.Napik: Но таким образом вы все равно можете предоставить свое собственное средство ведения журнала, что хорошо, когда вы используете среду ведения журнала.
Даниэль
54

Перед запуском tomcat, установите JAVA_OPTSкак указано ниже в Linux envs. Затем запустите Tomcat. Вы увидите запрос и ответ в catalina.outфайле.

export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true"
Upendra
источник
3
Brilliant. Это лучший ответ ИМХО.
Пабло Санта Круз
По некоторым причинам, для меня это:-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
Тибо
По какой-то причине это работало только на одном из 3 моих веб-сервисов (в моем веб-приложении Tomcat у меня есть 3 веб-сервиса JAX-WS). Есть идеи, почему это не сработает на всех 3?
Дэвид Броссар
Я отлично работал, чтобы понять, почему мой тест не удался (установите опцию в 'run configutration' моего теста как 'VM аргумент').
MrSmith42
Вы только что взломали Интернет с лучшим ответом за всю историю
vikingsteve
16

Установите следующие системные свойства, это включит ведение журнала xml. Вы можете установить его в Java или файл конфигурации.

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
--------------------------------------
2787184
источник
14

Внедрить 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) {
    }

}
Premraj
источник
Я точно следую этому. Я печатаю сообщение после внесения изменений в заголовок, однако я не вижу этих изменений. Похоже, что сообщение не изменяется до тех пор, пока оно не покинет метод handleMessage
Iofacture
Если я призываю напечатать сообщение дважды, во второй раз будет обновление. Очень странно
Iofacture
11

Существуют различные способы сделать это программно, как описано в других ответах, но это довольно инвазивные механизмы. Однако, если вы знаете, что используете JAX-WS RI (он же Metro), вы можете сделать это на уровне конфигурации. Смотрите здесь для получения инструкций о том, как это сделать. Нет необходимости возиться с вашим приложением.

skaffman
источник
2
Метро = JAX-WS RI + WSIT (то есть JAX-WS RI! = Metro)
Паскаль Thivent
@Pau: исправлено. Знаете, вместо того, чтобы голосовать за меня, вы могли бы приложить немного усилий и предложить альтернативную ссылку.
Скаффман
1
Если бы я нашел один, будь уверен, я бы его поставил. Не воспринимай это как личное. убрал голосование;)
По
Ссылка снова не работает (что случилось с java.net ???). Я думаю, что это новая ссылка: metro.java.net/nonav/1.2/guide/Logging.html
sdoca
9

// Это решение предоставляет способ программного добавления обработчика для клиента веб-службы без XML-конфигурации.

// Смотрите полный документ здесь: 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) {
}
}

// Программно добавляем ваш LogMessageHandler

   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);
TRIMIX
источник
4

Я публикую новый ответ, поскольку у меня недостаточно репутации, чтобы комментировать ответ, предоставленный Антонио (см. 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());

Обратите внимание, что при определенных обстоятельствах вызов метода writeTo () может работать не так, как ожидается (см .: 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());
Alex
источник
2

Вам необходимо реализовать javax.xml.ws.handler.LogicalHandler, затем на этот обработчик нужно ссылаться в файле конфигурации обработчика, на который, в свою очередь, ссылается аннотация @HandlerChain в вашей конечной точке службы (интерфейсе или реализации). Затем вы можете либо вывести сообщение через system.out, либо через регистратор в вашей реализации processMessage.

Видеть

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

stjohnroe
источник
2

Ответы, перечисленные здесь, которые направляют вас использовать SOAPHandler являются полностью правильными. Преимущество такого подхода заключается в том, что он будет работать с любой реализацией JAX-WS, поскольку SOAPHandler является частью спецификации JAX-WS. Однако проблема с SOAPHandler заключается в том, что он неявно пытается представить все сообщение XML в памяти. Это может привести к огромному использованию памяти. Различные реализации JAX-WS добавили свои обходные пути для этого. Если вы работаете с большими запросами или большими ответами, то вам нужно рассмотреть один из проприетарных подходов.

Поскольку вы спрашиваете о том, «который включен в JDK 1.5 или выше», я отвечу относительно того, что формально известно как JAX-WS RI (он же Metro), что входит в состав JDK.

JAX-WS RI имеет специальное решение для этого, которое очень эффективно с точки зрения использования памяти.

См. Https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . К сожалению, эта ссылка теперь не работает, но вы можете найти ее на WayBack Machine. Я дам основные моменты ниже:

В 2007 году сотрудники Metro представили дополнительный тип обработчиков MessageHandler<MessageHandlerContext>, который является собственностью Metro. Это гораздо эффективнее, чем SOAPHandler<SOAPMessageContext>попытка сделать представление DOM в памяти.

Вот ключевой текст из оригинальной статьи в блоге:

MessageHandler:

Используя расширяемую среду обработчика, предоставляемую спецификацией JAX-WS, и улучшенную абстракцию сообщений в RI, мы представили новый обработчик, призванный MessageHandlerрасширять приложения веб-служб. MessageHandler похож на SOAPHandler, за исключением того, что его реализации получают доступ кMessageHandlerContext(расширение MessageContext). Через MessageHandlerContext можно получить доступ к сообщению и обработать его с помощью API сообщения. Как я указал в заголовке блога, этот обработчик позволяет вам работать с Message, который предоставляет эффективные способы доступа / обработки сообщения, а не только сообщения на основе DOM. Модель программирования обработчиков такая же, и обработчики сообщений могут быть смешаны со стандартными обработчиками логики и SOAP. Я добавил пример в JAX-WS RI 2.1.3, показывающий использование MessageHandler для регистрации сообщений, и вот фрагмент из примера:

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, так что вы можете посмотреть в других ответах на этой странице, как это сделать.

Вы можете найти полный пример в репозитории Metro GitHub .

peterh
источник
1

Вы можете попытаться поставить ServletFilterперед веб-сервисом и проверить запрос и ответ, идущий к / возвращенный из сервиса.

Хотя вы специально не запрашивали прокси, иногда мне кажется, что tcptrace достаточно, чтобы посмотреть, что происходит в соединении. Это простой инструмент, без установки, он показывает потоки данных и может записывать в файл тоже.

RSP
источник
1

Во время выполнения вы можете просто выполнить

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

поскольку dump - это публичная переменная, определенная в классе следующим образом

public static boolean dump;
jozh
источник
Для меня работа с com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump = true;
userfb
1

Правильно ли я понимаю, что вы хотите изменить / получить доступ к необработанному XML-сообщению?

Если это так, вы (или так как это пять лет, следующий парень), возможно, захотите взглянуть на интерфейс провайдера, который является частью JAXWS. Клиентский аналог выполняется с помощью класса «Dispatch». В любом случае вам не нужно добавлять обработчики или перехватчики. Вы все еще можете, конечно. Недостатком является то, что вы несете полную ответственность за создание 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);
}
}

Или вы можете использовать класс Endpoint для этого. Надеюсь, это было полезно.

И, если вы хотите, вам не нужно разбираться с заголовками и прочим, если вы измените режим обслуживания на PAYLOAD (вы получите только Soap Body).

Аниш Бартакур
источник
1

с конфигурационными файлами logback.xml вы можете сделать:

<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");
JChanthamontry
источник
0

Один из способов сделать это - не использовать свой код, а использовать анализаторы сетевых пакетов, такие как Etheral или WireShark, которые могут перехватывать HTTP-пакет с помощью сообщения XML в качестве полезной нагрузки, и вы можете продолжать записывать их в файл или около того.

Но более сложный подход заключается в написании ваших собственных обработчиков сообщений. Вы можете посмотреть на это здесь .

Shamik
источник
0

Фактически. Если вы посмотрите на источники HttpClientTransport, вы заметите, что он также пишет сообщения в java.util.logging.Logger. Это означает, что вы можете видеть эти сообщения в своих журналах тоже.

Например, если вы используете Log4J2, все, что вам нужно сделать, это следующее:

  • добавьте мост JUL-Log4J2 в путь вашего класса
  • установить уровень TRACE для пакета com.sun.xml.internal.ws.transport.http.client.
  • добавьте -Djava.util.logging.manager = org.apache.logging.log4j.jul.LogManager системное свойство в командную строку запуска приложения.

После этих шагов вы начинаете видеть сообщения SOAP в ваших журналах.

glory1
источник
0

В этой теме есть несколько ответов с использованием SoapHandlers. Вы должны знать, что SoapHandlers изменяют сообщение, если оно writeTo(out)вызывается.

Вызов writeTo(out)метода SOAPMessage также автоматически вызывает saveChanges()метод. В результате все вложенные двоичные данные MTOM / XOP в сообщении теряются.

Я не уверен, почему это происходит, но это похоже на документированную функцию.

Кроме того, этот метод отмечает точку, в которой данные из всех составляющих объектов AttachmentPart помещаются в сообщение.

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

Микко Туоминен
источник
0

Если вы запустили сервер приложений IBM Liberty, просто добавьте ibm-ws-bnd.xml в каталог WEB-INF.

<?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>
Микко Туоминен
источник