Подтвердить что ты не робот

Отслеживать запрос/ответы SOAP с JAX-WS на стороне клиента

Я использую ссылочную реализацию 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).

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

Спасибо заранее.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

аргумент VM.

Ответ 3

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

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