Трассировка SOAP-запроса / ответов с JAX-WS на стороне клиента - PullRequest
18 голосов
/ 19 января 2011

Я использую эталонную реализацию JAX-WS (2.1.7) и хочу отслеживать запросы / ответы SOAP на стороне клиента .На самом деле, мне нужно изучить некоторые заголовки Http, когда я получу ответ.

После этих предыдущих вопросов ( Трассировка XML-запроса / ответов с JAX-WS и Java JAX-Клиент веб-службы WS: как регистрировать запрос и ответ xml? ), я создал свой собственный обработчик для регистрации при отправке запроса и получении ответа:

public class SHandler implements SOAPHandler<SOAPMessageContext>
{

  private static final Logger log = Logger.getLogger(SHandler.class);

  @Nullable
  @Override
  public Set<QName> getHeaders()
  {    
    log.debug(">>>>>>>>>>> GetHeaders");
    return null;    
  }

  @Override
  public boolean handleMessage(SOAPMessageContext soapMessageContext)
  {
    log.debug(">>>>>>>>>>> HandleMessage");
    return true;
  }

  @Override
  public boolean handleFault(SOAPMessageContext soapMessageContext)
  {
    log.debug(">>>>>>>>>>> HandleFault");
    return true;
  }

  @Override
  public void close(MessageContext messageContext)
  {
    log.debug(">>>>>>>>>>> Close");    
  }
}

и добавляюобработчик цепочки обработчиков во время инициализации службы:

@WebServiceClient(name = "MyService", targetNamespace = "http://www.whatever.com/", wsdlLocation = "file:/path/to/wsdl")
public class MyService extends Service
{

    public MyService(URL wsdlLocation) {
        super(...);
        initializeBinding();
    }

    @WebEndpoint(name = "MyOperation")
    public MyPort getMyPort() {
        return super.getPort(new QName("http://www.whatever.com/", "MyPort"), MyPort.class);
    }

    private void initializeBinding() {        
        MyPort port = getMyPort();
        BindingProvider bindingProvider = ((BindingProvider) port);
        List handlerChain = bindingProvider.getBinding().getHandlerChain();
        handlerChain.add(new SHandler());
        bindingProvider.getBinding().setHandlerChain(handlerChain);        
    }

    ...

}

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

Обратите внимание, что нет никакого конкретного WSDL, связанного с этой проблемой, потому что я работаю на платформе MDA, которая генерирует артефакты клиент / сервер из любого WSDL.Кроме того, я не могу сделать это на уровне конфигурации, так как все сгенерировано, поэтому я могу сделать это только программно (я гуглял это, и все решения, которые я нашел, были либо в исходном посте, либо с использованием цепочки обработчиков).XML-файл конфигурации).

Я что-то упустил?Есть ли другой способ сделать это?

Заранее спасибо.

Ответы [ 3 ]

22 голосов
/ 19 января 2011

Если вы хотите посмотреть только сообщения SOAP, запущенные с

-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true

Аргумент VM.

6 голосов
/ 19 января 2011

Почему бы не использовать @HandlerChain(file = "....") аннотацию?

Из моего pov вы не можете смешивать конфигурации на основе конструктора и аннотаций, поскольку инициализация веб-службы при развертывании и создание нового экземпляра класса обслуживания выполняются в совершенно разных контекстах.

1 голос
/ 20 января 2011

Есть 2 инструмента, которые вы можете использовать для этого:

Оба инструмента предлагают прокси-режим, который перехватывает, регистрирует и перенаправляет запросы и ответы.

...