0

该团队正在尝试使用 Anypoint Studio 7.3 中的 Microsoft Dynamics Nav 连接器通过动态过滤器获取数据。但是我们得到的是所有数据,而不是我们过滤的子集

我们在 Soap UI 中加载了 WSDL 文件,得到了一个如下所示的soap请求正文:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:con="urn:microsoft-dynamics-schemas/page/contactcard">
   <soapenv:Header/>
   <soapenv:Body>
      <con:ReadMultiple>
         <!--1 or more repetitions:-->
         <con:filter>
            <con:Field>Name</con:Field>
            <con:Criteria>'John Smith'</con:Criteria>
         </con:filter>
      </con:ReadMultiple>
   </soapenv:Body>
</soapenv:Envelope>

并通过编辑 Criteria 字段确认过滤器有效。

由于我们仍在学习 Anypoint Studio,我们决定坚持使用soap xml,并在我们的 mule 流中创建一个名为“filter”的变量,并将其定义为与上面的有效负载完全相同:

%dw 2.0
output application/xml
---
read('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:con="urn:microsoft-dynamics-schemas/page/contactcard">
   <soapenv:Header/>
   <soapenv:Body>
      <con:ReadMultiple>
         <!--1 or more repetitions:-->
         <con:filter>
            <con:Field>Name</con:Field>
            <con:Criteria>"John Smith"</con:Criteria>
         </con:filter>
      </con:ReadMultiple>
   </soapenv:Body>
</soapenv:Envelope>','application/xml')

我们添加了一个记录器并确认变量“过滤器”看起来像上面的代码。

作为最后一步,我们配置了 Microsoft Dynamics Page 连接器并确认连接正常。我们将 Service 定义为“Contact Card”,将 Operation 定义为 Read Multiple。

然后我们通过将“过滤器”变量(输入)[我知道,过滤器太多]的“过滤器”键连接到输出的“过滤器”元素来定义实体。在我们为过滤器变量定义元数据后,输出“过滤器”元素被自动暴露,过滤器变量的输入“过滤器”键被暴露。作为元数据,我们使用了一个与“过滤器”变量具有相同内容的示例 XML 文件。DataWeave 生成​​如下:

%dw 2.0
output application/java
ns ns0 urn:microsoft-dynamics-schemas/page/contactcard
---
{
    filter :  vars.filter.ns0#ReadMultiple.ns0#filter
}

一切正常,但我们提取了所有数据。当我们将 Criteria 从 --John Smith- 编辑为另一个不存在的值时 - 我们仍然获得了所有数据。我坚信数据编织定义的实际过滤器为空。

有人知道如何正确定义过滤器吗?描述 DynamicsNav 连接器的 Mulesoft 文档没有提到过滤器实体。

任何手动修改生成的 DataWeave 代码的尝试都会导致各种异常。

任何帮助,将不胜感激。谢谢。这是用于为过滤器变量生成元数据的文件内容。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:con="urn:microsoft-dynamics-schemas/page/contactcard">
   <soapenv:Header/>
   <soapenv:Body>
      <con:ReadMultiple>
         <!--1 or more repetitions:-->
         <con:filter>
            <con:Field>Name</con:Field>
            <con:Criteria>'John Smith'</con:Criteria>
         </con:filter>
      </con:ReadMultiple>
   </soapenv:Body>
</soapenv:Envelope>
4

1 回答 1

0

对于任何关心的人...这就是您为页面操作创建过滤器实体的方式(Microsoft Dynamics Nav Connector)

%dw 2.0
output application/java
ns ns0 urn:microsoft-dynamics-schemas/page/contactcard
---
{
    filter: [{
        ns0#Field : "COMPANY_NAME",
        ns0#Criteria : vars.CompanyName
    }]
}

显然,对于像“VendorCard”这样的任何其他实体,需要编辑命名空间。字段值必须全部大写。但是,如果您不正确,日志将显示所有现有的有效字段名称。“CompanyName”是您必须在别处设置的变量,“vars”是通向 mule 消息中所有变量的网关。如果您需要过滤多个字段,可以将更多过滤器添加到同一个“过滤器”数组中。

我希望 Mulesoft 文档能够引导您完成整个过程。那好吧。

于 2019-08-16T20:43:30.307 回答