Изменить заголовок Soap в SoapHandler

Я пытаюсь изменить заголовок мыла, и я хочу, чтобы заголовок был таким

<soapenv:Header xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <ns:authnHeader soapenv:mustUnderstand="0" xmlns:ns="http://webservices.averittexpress.com/authn">
                <Username>xxxxxxxx</Username>
                <Password>xxxxxxxx</Password>
            </ns:authnHeader>

Это то, что я сделал до сих пор ...

SOAPEnvelope envelope = context.getMessage().getSOAPPart().getEnvelope();
SOAPHeader header = envelope.getHeader();

    header.addAttribute(new QName("xmlns:soapenc"), "http://schemas.xmlsoap.org/soap/encoding/");
    header.addAttribute(new QName("xmlns:xsd"), "http://www.w3.org/2001/XMLSchema");
    header.addAttribute(new QName("xmlns:xsi"), "http://www.w3.org/2001/XMLSchema-instance");

SOAPElement authnHeader = header.addChildElement("authnHeader", "ns" , "http://webservices.averittexpress.com/authn");

authnHeader.addAttribute(new QName("soapenv:mustUnderstand"), "0");

Но я получаю

org.w3c.dom.DOMException: NAMESPACE_ERR: Предпринята попытка создать или изменить объект способом, неверным в отношении пространств имен.

сначала header.addAttribute.

Пожалуйста помоги.

Мои заявления об импорте

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.PortInfo;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

person Shashank Degloorkar    schedule 04.03.2015    source источник
comment
Возможно ли, что вы должны сначала удалить старые атрибуты заголовка, прежде чем добавлять новые? Взгляните на эту статью SO: stackoverflow. ком/вопросы/7473145/   -  person Tim Biegeleisen    schedule 04.03.2015
comment
по умолчанию атрибутов нет.   -  person Shashank Degloorkar    schedule 04.03.2015
comment
Попробуйте добавить каждый атрибут, по одному за раз, и посмотрите, сможете ли вы установить какой-либо атрибут в своем заголовке.   -  person Tim Biegeleisen    schedule 04.03.2015
comment
Также, пожалуйста, покажите нам ваши операторы импорта для SOAP, а также какой JAR вы используете.   -  person Tim Biegeleisen    schedule 04.03.2015


Ответы (2)


Вы получаете эту ошибку, потому что пытаетесь определить атрибуты пространства имен в заголовке SOAP. Атрибуты пространства имен xmlns должны быть определены в конверте SOAP. Таким образом, конверт XML SOAP, который вам действительно нужен, будет выглядеть примерно так:

<soap:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap:Header>
        <ns:authnHeader soapenv:mustUnderstand="0" xmlns:ns="http://webservices.averittexpress.com/authn">
            <Username>xxxxxxxx</Username>
            <Password>xxxxxxxx</Password>
        </ns:authnHeader>
    </soap:Header>
    <soap:Body>
        <!-- your content goes here -->
    </soap:Body>
</soap:Envelope>

В соответствии с соглашениями, если ваш XML не предоставляет пространство имен SOAP в конверте, приложения могут отклонить ваш SOAP-сообщение.

Для справки, я потратил около 3 часов, пытаясь найти один пример кода, где кто-то вызывает header.addAttribute() в заголовке SOAP, и я не смог найти ни одного.

person Tim Biegeleisen    schedule 04.03.2015

Наконец-то повезло.

Этот код работает

Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

if(outboundProperty.booleanValue())
{

   try
    {
         SOAPHeader header = context.getMessage().getSOAPPart().getEnvelope().getHeader();

         SOAPFactory soapFactory = SOAPFactory.newInstance();
         SOAPElement authnHeader = soapFactory.createElement("authnHeader", "ns", "http://webservices.averittexpress.com/authn");

         SOAPElement username = authnHeader.addChildElement("Username");
         username.setTextContent("xxxxxxx");

         SOAPElement password = authnHeader.addChildElement("Password");
         password.setTextContent("xxxxxxx");

         header.addChildElement(authnHeader);
    }
    catch(Exception e)
    {
       e.printStackTrace();
    }
}

После добавления заголовка не забудьте сохранить сообщение

context.getMessage().saveChanges();

or

context.getMessage().writeTo(System.out);

также сохраняет сообщение, если сделаны какие-либо изменения.

person Shashank Degloorkar    schedule 06.03.2015