Я использую ссылочную реализацию 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).
Я что-то упустил? Есть ли другой способ сделать это?
Спасибо заранее.