Mule DataWeave 转换消息失败,缺少元数据:id 属性

Posted

技术标签:

【中文标题】Mule DataWeave 转换消息失败,缺少元数据:id 属性【英文标题】:Mule DataWeave transform-message failing with missing metadata:id attribute 【发布时间】:2016-07-30 09:59:37 【问题描述】:

我有一个非常简单的 hashmap 有效负载被转换为 application/json。我在其他流程中通过将 dataweave 组件拖入并编写映射表达式来完成此操作。

现在由于某种原因,我收到以下错误:

与元素类型“dw:transform-message”关联的属性“metadata:id”的前缀“metadata”未绑定。

当我查看 xml 时,我发现我的新 dataweave 组件没有 metadata:id 属性,但我使用的其他 dataweave 组件确实有 metadata:id 属性。

    为什么这些行为不同? 为什么元数据:id 没有像其他流那样自动生成? 为什么首先需要 metadata:id 属性?在这两种情况下,我在调用映射器之前都使用 JSON to Object 组件。

【问题讨论】:

【参考方案1】:

使用 DataWeave 组件时,需要声明 xml 命名空间。如果您使用的是 Studio 设计器,那么只要您将组件拖放到配置中,Studio 就会添加相关的命名空间。

因此,当您拖放 dataweave 组件时,studio 会将以下命名空间和架构位置添加到配置中 -

xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw"

http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd

在 Mule 中,您可以为每个组件定义元数据,这将有助于在设计时查看数据结构。所有这些元数据定义都存储在project_home\catalog 文件夹下,文件名类似于UUID。然后将这些文件名添加到具有metadata:id 属性的组件定义中。即使一个组件也需要元数据命名空间(不必 DW,因为元数据是所有组件共有的功能)。

<dw:transform-message metadata:id="262e6569-8f38-4e0b-a61d-15550870101e" doc:name="Transform Message">

如果您从 Studio 设计器添加元数据,则 Studio 应自动添加以下命名空间和架构位置。如果您手动添加它或从一个xml复制粘贴到另一个没有它的xml,那么您需要自己添加它 -

xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata"

带有 Dataweave 和元数据的示例配置如下所示 -

<mule xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd">

【讨论】:

我终于发现系统出现故障是因为上游的组件不同。我有一个传递变量参数的数据库命令,但我错过了 VARCHAR 数据类型。 最疯狂的是,在上游组件错误的错误消息开始出现之前,我必须删除所有 dataweave 组件 我们不再需要在 Mule 4 中添加元数据。任何开箱即用的工作室都支持它。【参考方案2】:

我相信包含metadata 属性是为了指向一个资源,在该资源中,您已在示例文件的后面为DataWeave 输入和/或输出结构定义了一些元数据。您在上面详述的错误看起来像架构验证,请检查您在 XML 配置中打开的 mule 标记中是否有以下内容:

xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" 
xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" 
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd

希望有帮助!

【讨论】:

以上是关于Mule DataWeave 转换消息失败,缺少元数据:id 属性的主要内容,如果未能解决你的问题,请参考以下文章

在dataweave 2.0 Mule4中将XML CDATA格式转换为JSON格式

使用 Mule Dataweave 导入 CSV?

如何忽略 DataWeave Mule esb 中的空对象

Mule 4:Dataweave 2.0:如何处理大小超过10k的数据库记录?

从dataweave 2.0 Mule 4中的父JSON对象中提取JSON键值对的子集作为对象

为什么Multipartform-data在响应Mule Dataweave时删除Nill?