Apache CXF удаляет квалификаторы пространства имен в разделе тела, когда я динамически добавляю SOAP: HEADER.Как мне вернуть классификаторы? - PullRequest
0 голосов
/ 29 марта 2019

Я разработал приложение, которое отправляет запросы 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;
}
...