Почему header null?

Рейтинг: -1Ответов: 1Опубликовано: 03.07.2023

Как получить Header, а именно проверить есть ли тег во входящей xml в Java? Для этого есть нижеприведённый код, на сколько понимаю Object внутри Header и нужно сначала получить Header, но он всегда null, кажется я до конца не понимаю как это работает Буду благодарен любой помощи и советам!

XML:

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header>
        <wsse:Security soapenv:actor=""
            xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <ds:Signature
                xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <Object> // Нужно вытащить этот тег в Javа
                    <urn:authorities
                        xmlns:urn="urn:ru:fss:integration:types:signature:v01">
                        <urn:authority>
                            <urn:referenceId/>
                            <urn1:powerOfAttorneyLink
                                xmlns:urn1="urn:ru:fss:integration:types:mchd:v01">
                            <urn1:uuid="dff27a6c-174e-11ee-be56-0242ac120002"/>
                            </urn1:powerOfAttorneyLink>
                        </urn:authority>
                    </urn:authorities>
                </Object>
            </ds:Signature>
        </wsse:Security>
    </soapenv:Header>
    <soapenv:Body wsu:Id="OGRN_1957246130095"
        xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <ws:PutMessageRequest
            xmlns:ws="http://ru/sedo/ws">
            <systemInfo>
                <specVersion>1.0</specVersion>
                <software>SAP</software>
                <softwareVersion>604</softwareVersion>
            </systemInfo>
            <interactionType>2</interactionType>
            <recipientId>7707024177</recipientId>
            <messageType>86</messageType>
            <message>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48dXJuOmluc3VyZWRQZXJzb24geG1sbnM6dXJuPSJ1cm46cnU6ZnNzOmludGVncmF0aW9uOnR5cGVzOnJwdTpJbnN1cmVkUGVyc29uOnYwMSIgeG1sbnM6djAyPSJodHRwOi8vd3d3LmZzcy5ydS9pbnRlZ3JhdGlvbi90eXBlcy9wZXJzb24vdjAyIiB4bWxuczp2MDE9Imh0dHA6Ly93d3cuZnNzLnJ1L2ludGVncmF0aW9uL3R5cGVzL2NvbW1vbi92MDEiPjx1cm46ZnVsbE5hbWU+PHYwMjpmaXJzdE5hbWU+0JDQu9C10LrRgdCw0L3QtNGAPC92MDI6Zmlyc3ROYW1lPjx2MDI6bGFzdE5hbWU+0J3QuNC60L7Qu9Cw0LXQsjwvdjAyOmxhc3ROYW1lPjx2MDI6bWlkZGxlTmFtZT7Qk9C10L3QvdCw0LTRjNC10LLQuNGHPC92MDI6bWlkZGxlTmFtZT48L3VybjpmdWxsTmFtZT48dXJuOmJpcnRoRGF0ZT4xOTc4LTAxLTA1PC91cm46YmlydGhEYXRlPjx1cm46Z2VuZGVyPk1BTEU8L3VybjpnZW5kZXI+PHVybjpzbmlscz4xNTQ1ODAwNDQ1ODwvdXJuOnNuaWxzPjx1cm46aW5uPjE4MzEwNDk5MDYwMTwvdXJuOmlubj48dXJuOmlkZW50aXR5RG9jdW1lbnQ+PHVybjpvdGhlcklkZW50RG9jVHlwZT48dXJuOnR5cGU+MTA8L3Vybjp0eXBlPjx1cm46bnVtYmVyPjM1MzQ8L3VybjpudW1iZXI+PHVybjpleHBpcmF0aW9uRGF0ZT4yMDIyLTAzLTAxPC91cm46ZXhwaXJhdGlvbkRhdGU+PC91cm46b3RoZXJJZGVudERvY1R5cGU+PC91cm46aWRlbnRpdHlEb2N1bWVudD48dXJuOm1ldGhvZFJlY2VpdmVQYXltZW50Pjx2MDE6YmFua0luZm8+PHYwMTpiYW5rTmFtZT7QntCQ0J4gItCQ0JvQrNCk0JAt0JHQkNCd0JoiPC92MDE6YmFua05hbWU+PHYwMTpiaWs+MDQ0NTI1NTkzPC92MDE6YmlrPjx2MDE6YWNjb3VudE51bT40MDgxNzgxMDYwNDQzMDA1MjMxMjwvdjAxOmFjY291bnROdW0+PC92MDE6YmFua0luZm8+PC91cm46bWV0aG9kUmVjZWl2ZVBheW1lbnQ+PC91cm46aW5zdXJlZFBlcnNvbj4=</message>
        </ws:PutMessageRequest>
    </soapenv:Body>
</soapenv:Envelope>

JAVA CODE:

public class SignRequestHandler implements SOAPHandler<SOAPMessageContext> {
   
    public SignRequestHandler() {
        try {
            this.conf = HandlersConfigurations.getInstance();
            this.cryptoService = new MainEndpointImplService(this.conf.getJcpWrapperWsUrl());
            Properties props = new Properties();
            props.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("ftp-util-cryptopro-jcp-handlers-gost.properties"));
            algorithm = props.getProperty("ru.ftp.util.ws.crypto.gost.handlers.handlersconfigurations.algorithm");
            referenceDataCodeForSedo = props.getProperty("ru.ftp.util.ws.crypto.gost.handlers.handlersconfigurations.referenceDataCodeForSedo");
            actorForSedo = props.getProperty("ru.ftp.util.ws.crypto.gost.handlers.handlersconfigurations.actorForSedo");
            referenceCertificateCodeForSedo = props.getProperty("ru.ftp.util.ws.crypto.gost.handlers.handlersconfigurations.referenceCertificateCodeForSedo");
        } catch (Exception var2) {
            var2.printStackTrace();
            throw new RuntimeException(var2);
        }
    }

    public boolean handleMessage(SOAPMessageContext messageContext) {

        Boolean isResponse = (Boolean) messageContext.get("javax.xml.ws.handler.message.outbound");
        String wsdlOperation = ((QName) messageContext.get(MessageContext.WSDL_OPERATION)).getLocalPart();

Вот тут Header всегда null, хотя в изначальной xml он имеется
        try {
            SOAPHeader header = messageContext.getMessage().getSOAPHeader(); //Почему null?
        } catch (SOAPException e) {
            throw new RuntimeException(e);
        }
    } ETC...

Ответы

▲ 0

Насколько я понимаю Вам сначала нужно получить самый "верхний" элемент. И это не Header, а Envelope. Можно попробовать так

// Создается построитель документа
    
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    File f = new File("xml_dir/new_plant.xml");
    Document doc = builder.parse(f);

// обращаемся к верхнему тэгу
    Element envelope = doc.getDocumentElement();
// пробуем получить элементы по тэгу
    NodeList children= envelope.getElementsByTagName(Object)

Я в проектах обычно считываю все построчно, применительно к вашему xml это выглядело бы примерно так:

// Создается построитель документа
    
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    File f = new File("xml_dir/new_plant.xml");
    Document doc = builder.parse(f);

// обращаемся к верхнему тэгу
    Element envelope = doc.getDocumentElement();
// создаем  список "детей" верхнего тэга и дальше итерируем по ним
    NodeList children = envelope.getChildNodes();
    for (int i = 0; i < children.getLength(); i++) {
        Node childOfEnvelope = children.item(i);
      if (childOfEnvelope instanceof Element) {
            Element childOfEnvelopeElement = (Element) childOfEnvelope;
            NodeList childrenNext = childOfEnvelopeElement.getChildNodes();

и так до конца, по всем вложенным тэгам. Надеюсь, ответ будет Вам хоть немного полезен.