2015-10-08 2 views
0

У меня есть веб-служба .NET, у которой есть метод, который принимает строку. В студии Anypoint от Mulesoft я успешно построил поток, который принимает POST, передает строку POSTed в службу и возвращает обработанный результат.MuleSoft DataWeave - вызов службы SOAP через службу веб-сервиса

Теперь я пытаюсь создать поток для аналогичной службы, за исключением того, что эта служба принимает пользовательский объект, а не строку. Когда я использую пользовательский интерфейс SOAP для непосредственного тестирования моей службы, я передаю следующий XML и успешно создает объект в моей службе, а значения MyFirstString и MySecondString доступны этой службе.

SOAP UI XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:pra="http://schemas.datacontract.org/2004/07/Pra.Lib.Transformation"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:Transform>   
     <tem:transformationData>    
      <pra:MyFirstString>test1</pra:MyFirstString> 
      <pra:MySecondString>test2</pra:MySecondString> 
     </tem:transformationData> 
     </tem:Transform> 
    </soapenv:Body> 
</soapenv:Envelope> 

Однако, когда я использую мой Мул поток и падение мой DataWeave перед моей веб-службы потребителя, он автоматически строит XML-строку, которая не работает с сервисом , Когда я прикрепляю отладчик к сервису, он показывает, что объект не был создан/отображен успешно ... MyFirstString и MySecondString равны null после того, как сделан запрос пользователя Web Service Consumer.

код DataWeave:

%dw 1.0 
%output application/xml 
%namespace ns0 http://tempuri.org/ 
--- 
//Some output fields where skipped as the structure is too deep (more than 2 levels). 
//To add missing fields click on the scaffold icon (second on the toolbar). 
{ 
    ns0#Transform: { 
     ns0#transformationData: { 
      Xml: "test1", 
      Xslt: "test2" 
     } 
    } 
} 

DataWeave выход:.

<?xml version='1.0' encoding='windows-1252'?> 
<ns0:Transform xmlns:ns0="http://tempuri.org/"> 
    <ns0:transformationData> 
    <Xml>test1</Xml> 
    <Xslt>test2</Xslt> 
    </ns0:transformationData> 
</ns0:Transform> 

Сообщение об ошибке Возвращается «Ошибка десериализации тела сообщения запроса для операции 'Transform' OperationFormatter обнаружил недопустимое тело сообщения. Ожидается найти тип узла «Элемент» с именем «Преобразование» и пространство имен «http://tempuri.org/». Найденный тип узла «Элемент» с именем «EXTRACT_DETAIL» и пространство имен ». Полезная нагрузка сообщения имеет тип: ElementNSImpl«

Итак, если я понимаю эту ошибку ... мой вопрос заключается в том, как я могу кодировать DataWeave для вывода в формате soap-конверта, который использует интерфейс SOAP ... потому что создается структура элементов DataWeave, что вызывает проблемы? Большое спасибо.

ответ

0

Один разработчик смог указать мне в правильном направлении. В AnyPoint Studio на вкладке свойств компонента DataWeave/TransformMessage мне пришлось щелкнуть по кнопке «Выходная структура леса». Это создало следующий вывод (синтаксические изменения выделены жирным шрифтом ниже). Первоначально у меня создалось впечатление, что все строительные леса были автоматическими, когда сначала бросали компонент в поток.

Синтаксис что изменилось:

   ns1#Xml: "test1", 
       ns1#Xslt: "test2" 

Целые леса:

%dw 1.0 
%output application/xml 
%namespace ns0 http://tempuri.org/ 
--- 
//Some output fields where skipped as the structure is too deep (more than 2 levels). 
//To add missing fields click on the scaffold icon (second on the toolbar). 
{ 
    ns0#Transform: { 
     ns0#transformationData: { 
      ns1#Xml: "test1", 
      ns1#Xslt: "test2" 
     } 
    } 
} 

Нажмите здесь для кнопки Scaffold screen capture

0

Да после настройки вашего WSDL можно перетаскивать Плетение данных, а затем нажмите на эшафот, он создаст для вас соответствующую структуру.

enter image description here