Я разработал приложение, которое отправляет запросы SOAP различным службам через Apache CXF 2.7.10.
Для некоторых запросов мне нужно передать SOAP: HEADR с дополнительными данными для обработки, для других - нет.не делать.По этой причине я динамически добавляю заголовки в мой код.
Чистый запрос:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getList xmlns:ns2="http://service.com/front/list">
<code>1</code>
<requestId>636978</requestId>
<version>0.1</version>
<buildId>401163</buildId>
<clientId>500</clientId>
<active>true</active>
</ns2:getList>
</soap:Body>
</soap:Envelope>
Запрос с заголовком:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"/>
<soap:Body>
<getList xmlns="http://service.com/front/list" xmlns:ns2="http://service.com/front/list">
<code>1</code>
<requestId>636992</requestId>
<version>0.1</version>
<buildId>401163</buildId>
<clientId>500</clientId>
<active>true</active>
</getList>
</soap:Body>
</soap:Envelope>
Код для очистки заголовков:
bindingProvider.binding.handlerChain = null
Код для добавления заголовков:
bindingProvider.binding.handlerChain = listOf(CacheSoapHeaderHandler())
CacheSoapHeaderHandler:
public class CacheSoapHeaderHandler implements SOAPHandler<SOAPMessageContext> {
private static final ObjectFactory OBJECT_FACTORY = new ObjectFactory();
private static final JAXBContext context = createContext();
public CacheSoapHeaderHandler() {
}
@Override
public boolean handleMessage(SOAPMessageContext smc) {
return true;
}
@Override
public Set<QName> getHeaders() {
return null;
}
@Override
public void close(MessageContext arg0) {
}
@Override
public boolean handleFault(SOAPMessageContext arg0) {
return true;
}
private static JAXBContext createContext() {
try {
return JAXBContext.newInstance(CacheInfo.class);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Как я могу вернуть квалификатор 'ns2' в разделе тела, когда ядобавить заголовки?
Решение: вы можете изменить заголовок сообщения и тело в SOAPHandler, включая пространства имен и их префиксы (квалификаторы):
@Override
public boolean handleMessage(SOAPMessageContext smc) {
try {
smc.getMessage().getSOAPBody().getFirstChild().setPrefix("ns2");
smc.getMessage().getSOAPBody().getFirstChild().getAttributes().removeNamedItem("xmlns");
} catch (Exception e) {
throw new IllegalArgumentException("Can't generate a WS request", e);
}
return true;
}