Как добавить элемент документа xmlbean в заголовок мыла spring-ws

Я пытаюсь подключиться к веб-сервису с помощью spring-ws, но производителю веб-сервиса требуется настраиваемый элемент в заголовке мыла. Я очень новичок в веб-сервисах, и у меня возникают проблемы с попыткой ввести значения в заголовок мыла. Я использую XMLBeans для преобразования из xsd в java, а также для маршалинга и демаршалинга. Я создал документ xmlbean и установил все значения для пользовательского элемента заголовка, мне просто нужно получить документ или, может быть, даже просто элемент, прикрепленный к этому документу, для внедрения в заголовок мыла. Ниже приведен wsdl (просто заголовок) в soapui (то, что я использовал для изучения и первоначального тестирования).

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://www.ups.com/XMLSchema/XOLTWS/UPSS/v1.0" xmlns:v11="http://www.ups.com/XMLSchema/XOLTWS/Rate/v1.1" xmlns:v12="http://www.ups.com/XMLSchema/XOLTWS/Common/v1.0">
   <soapenv:Header>
      <v1:UPSSecurity>
         <v1:UsernameToken>
            <v1:Username>name</v1:Username>
            <v1:Password>password</v1:Password>
         </v1:UsernameToken>
         <v1:ServiceAccessToken>
            <v1:AccessLicenseNumber>accesskey</v1:AccessLicenseNumber>
         </v1:ServiceAccessToken>
      </v1:UPSSecurity>
   </soapenv:Header>

person Scott    schedule 13.06.2015    source источник


Ответы (3)


Я нашел решение, которое работает и не содержит большого количества кода. Мне пришлось отказаться от использования xmlbeans и просто создать элементы, но, по крайней мере, функциональность есть, и вызовы веб-сервиса работают.

@Override
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException
{
    try
    {
        SOAPMessage soapMessage = ((SaajSoapMessage)message).getSaajMessage();
        SOAPHeader header = soapMessage.getSOAPHeader();
        SOAPHeaderElement soapHeaderElement = header.addHeaderElement(new QName("http://www.ups.com/XMLSchema/XOLTWS/UPSS/v1.0", "UPSSecurity", "v1"));
        SOAPEnvelope envelope = soapMessage.getSOAPPart().getEnvelope();
        envelope.addNamespaceDeclaration("v1", "http://www.ups.com/XMLSchema/XOLTWS/UPSS/v1.0");

        SOAPElement usernameToken = soapHeaderElement.addChildElement("UsernameToken", "v1");
        SOAPElement username = usernameToken.addChildElement("Username", "v1");
        SOAPElement password = usernameToken.addChildElement("Password", "v1");

        SOAPElement serviceAccessToken = soapHeaderElement.addChildElement("ServiceAccessToken", "v1");
        SOAPElement accessLicenseNumber = serviceAccessToken.addChildElement("AccessLicenseNumber", "v1");

        username.setTextContent("username");
        password.setTextContent("password");
        accessLicenseNumber.setTextContent("key");
    } 
    catch (SOAPException e)
    {
        e.printStackTrace();
    }
}
person Scott    schedule 14.06.2015

Вы можете маршалировать к результату SoapHeader, например так:

SoapMessage msg = ...
SoapHeader header = msg.getSoapHeader();

XmlBeansMarshaller marshaller = ...
MyXmlBeansDocument doc = ...
marshaller.marshal(doc, header.getResult());
person Arjen Poutsma    schedule 15.06.2015

Вы можете преобразовать XmlObject (модель XmlBeans) в SOAPElement, используя следующий заводской метод:

YourModel xmlObject = YourModelDocument.Factory.newInstance().addNewYourModel();
SOAPElement soapElement = SOAPFactory.newInstance()
        .createElement((Element) xmlObject.getDomNode());

XmlObject должен быть частью документа, иначе getDomNode() вернет XmlFragment, а не Element.

После преобразования в элемент SOAP XML можно добавить к большинству частей SOAPMessage с помощью addChildElement(). Например:

SOAPMessage soapMessage = MessageFactory.newInstance().createMessage();
soapMessage.getSOAPBody().addChildElement(soapElement);
person Mike Houston    schedule 10.10.2020