2014-09-14 4 views
2

Мой вопрос в основном такой же, как this question.
У меня недостаточно репутации, чтобы добавить комментарий к вопросу OP. Пожалуйста, помогитеВесна добавляет два элемента в заголовок SOAP

Проблемы у меня есть:
Вебов-служба SOAP Я пытаюсь вызвать требует заголовка, чтобы иметь два элемента, один из них содержат основные данные заголовка и других с синхронизацией конкретных данными, заголовок что требуется, выглядит так:

<header> 
    <initHeader> 
    <requestID></requestId> 
    <...some more elements> 
    </initHeader> 
<syncHeader> 
    <appId></appId> 
    <dateTime></dateTime> 
    <event></event> 
</syncHeader> 
</header> 

При создании заголовка с использованием WebServiceMessageCallback (в частности, в процессе преобразования, показанного ниже), я получаю это:

"ERROR: 'The markup in the document following the root element must be well-formed.'"

Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.transform(new StringSource(soapHeaderStr), ((SoapMessage) message).getSoapHeader().getResult()); 

Проблема в том, что трансформатор ожидает, что все элементы в заголовке будут находиться под одним корневым элементом. Но здесь заголовок имеет два.

Я изменил данные заголовка, как это (ниже), и трансформатор не жалуется.

<header> 
     <myRootelement> 
     <initHeader> 
     <requestID></requestId> 
     <...some more elements> 
     </initHeader> 
    <syncHeader> 
     <appId></appId> 
     <dateTime></dateTime> 
     <event></event> 
    </syncHeader> 
    </myRootelement> 
    </header> 

В соответствии с указанной выше вопрос, ОП удалось решить эту проблему путем addigng фиктивный корневой элемент, как указано выше, с последующим удалением его непосредственно перед превращая его в заголовок.

Я хочу знать, как это удаление фиктивных корневых элементов возможно? Что-то вроде этого может быть? http://technology.amis.nl/2011/05/16/how-to-remove-unwanted-soap-header-elements-in-jax-ws/
Я не совсем уверен, как удалить корневой элемент, сохранив при этом своих детей.

ответ

1

удалось решить эту проблему, вот как:

Вместо сортировочных два элемента в объекты StringResult, а затем пытается добавить их к коллектору с помощью трансформатора, как это:

StringResult stringResult = new StringResult(); 
webServiceTemplate.getMarshaller().marshal(element, stringResult); 
StringSource headerSource = new StringSource(stringResult.toString()); 
Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.transform(headerSource, soapHeader.getResult()); 

Вы можете маршал два элемента непосредственно в заголовок мыла, как это:

webServiceTemplate.getMarshaller().marshal(element1,soapHeader.getResult()); 
webServiceTemplate.getMarshaller().marshal(element2,soapHeader.getResult()); 

Маршаллер, упомянутый здесь, является «org.springframework.oxm.jaxb.Jaxb2Marshaller» Элементы 1 и 2 выше представляют собой элементы JAXB, созданные с использованием сгенерированного класса Factory.

При таком подходе нет необходимости добавлять фиктивные корневые элементы.

Надеюсь, это поможет кому-то там, и спасибо Grigori.G за то, что указали мне в правильном направлении!

 Смежные вопросы

  • Нет связанных вопросов^_^