MuleSoft DataWeave - 通过Web服务使用者

时间:2015-10-08 18:34:35

标签: web-services soap mule anypoint-studio dataweave

我有一个.NET Web服务,它有一个接受字符串的方法。在Mulesoft的Anypoint工作室中,我成功构建了一个接受POST的流程,将POSTed字符串传递给服务,并返回一个操纵结果。

我现在正在尝试为类似的服务创建一个流,除了该服务接受自定义对象,而不是字符串。当我使用SOAP UI直接测试我的服务时,我传入以下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>

但是,当我使用我的Mule流并将我的DataWeave放在我的Web服务使用者面前时,它会自动构建一个不能与该服务一起使用的XML字符串。当我将调试器附加到服务时,它表明该对象未成功构建/映射...在进行Web服务消费者调用后,MyFirstString和MySecondString为null。

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>

返回的错误消息是“反序列化操作'转换'的请求消息正文时出错.ActionFormatter遇到一个无效的消息体。预计会找到名为'Transform'的节点类型'Element'和名称空间'http://tempuri.org/ '。找到名为'EXTRACT_DETAIL'和名称空间''的节点类型'Element'。消息有效负载的类型为:ElementNSImpl“

所以,如果我理解这个错误...我的问题是如何编码DataWeave以SOAP UI使用的soap信封格式输出...因为似乎DataWeave生成的元素结构是什么给我带来了问题?非常感谢。

2 个答案:

答案 0 :(得分: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"
        }
    }
}

点击此处查看脚手架按钮 screen capture

答案 1 :(得分:0)

在配置WSDL之后,您可以拖放Data Weave,然后单击scaffold,它将为您生成适当的结构。

enter image description here