DataWeave 如何知道要使用什么 reader/writer? (骡子 4)
How does DataWeave know what reader/writer to use? (Mule 4)
我在理解 DW 的一个非常基本的主题时遇到问题:我读过 https://docs.mulesoft.com/mule-user-guide/v/4.1/dataweave-formats 但对我来说它并没有解释 "DataWeave can read and write many types of data formats" 的确切含义,即:
1) DW 在什么时候决定它是 "reading",比如说,JSON 输入?
2) 究竟是如何做出决定的,即 Mule 消息中的什么决定输入应被读取为 JSON(有效负载类型?属性?)?
3) DW "write",比方说,JSON 在什么时候输出?
4) 从 DW 脚本的 JSON 输出创建的 Mule 消息到底是怎样的(负载类型?属性?)?
我将尝试解释 DW 在 mule 中是如何工作的:
输入部分
- Mule 有一个特殊的对象调用 TypedValue,这个 class 表示一个 Pair Being DataType = Pair。
- 所有变量,有效载荷都是TypedValue。而且它也可能出现在更多嵌套的地方。例如 File returns a List 中的列表操作,因此有效载荷将是 TypedValue,DataType> 所以这允许我们同时列出不同类型的文件 json、xml 等,并且dw 全部阅读。
DW 使用 DataType 部分根据 MimeType 确定要使用的 reader 以及如何根据 mimetype 属性配置 reader(编码,reader 属性)
输出部分
DW 始终输出 TypedValue。现在有趣的部分是 DW 如何推断驱动编写器使用的数据类型部分。
- 如果用户使用输出指令在脚本中指定它,那么很容易
- 如果正在执行的脚本被分配给消息处理器字段,那么引擎将根据该字段的元数据向 DW 提供预期类型的提示。例如。如果它是 Pojo,那么 DW 将知道要实例化什么 class 并且知道它需要使用 Java Writer,因此用户不需要知道所有这些内部内容。
有趣的部分是当我们不知道 set-payload 时。那么逻辑是这样的:
DW 将查看脚本并查看正在使用的输入,如果它们都是 same/compatible 数据类型,那么它将使用它。这意味着如果在您的脚本中放置 <set-payload value="#[payload.foo]/>
我们将查看有效载荷的类型,如果有效载荷是 Json 那么我们将使用 Json 编写器。现在,如果使用了多个输入并且它们来自不同的数据类型,则会抛出一个错误,即 <set-payload value="#[payload.foo ++ vars.bar]/>
是 xml 类型的 vars.bar
和 payload
类型 Json。因此,有时特别是在 xml 上,您可能会在一组有效负载上编写一个表达式,并且您可能会失败,因为它最终成为无效的 xml(例如多个根)。
如果未使用输入,则使用 Java 编写器。所以 <set-payload value="#[{a: true}]/>
将输出带有条目的 java.util.Map ("a", true)
对于 Logger
消息处理器,我们做了一件特殊的事情来避免日志错误。我们尝试使用 #3
下的逻辑,但如果因为编写器无法发出该数据结构而失败,那么我们使用 DataWeave 编写器,它可以编写任何可能的数据结构,因为 dw 语言基本上是所有格式的超集它处理(它包含它们的所有功能:对象、数组、名称空间、数字、字符串等...)
希望这能解释清楚
我在理解 DW 的一个非常基本的主题时遇到问题:我读过 https://docs.mulesoft.com/mule-user-guide/v/4.1/dataweave-formats 但对我来说它并没有解释 "DataWeave can read and write many types of data formats" 的确切含义,即:
1) DW 在什么时候决定它是 "reading",比如说,JSON 输入?
2) 究竟是如何做出决定的,即 Mule 消息中的什么决定输入应被读取为 JSON(有效负载类型?属性?)?
3) DW "write",比方说,JSON 在什么时候输出?
4) 从 DW 脚本的 JSON 输出创建的 Mule 消息到底是怎样的(负载类型?属性?)?
我将尝试解释 DW 在 mule 中是如何工作的:
输入部分
- Mule 有一个特殊的对象调用 TypedValue,这个 class 表示一个 Pair Being DataType = Pair。
- 所有变量,有效载荷都是TypedValue。而且它也可能出现在更多嵌套的地方。例如 File returns a List 中的列表操作,因此有效载荷将是 TypedValue,DataType> 所以这允许我们同时列出不同类型的文件 json、xml 等,并且dw 全部阅读。
DW 使用 DataType 部分根据 MimeType 确定要使用的 reader 以及如何根据 mimetype 属性配置 reader(编码,reader 属性)
输出部分
DW 始终输出 TypedValue。现在有趣的部分是 DW 如何推断驱动编写器使用的数据类型部分。
- 如果用户使用输出指令在脚本中指定它,那么很容易
- 如果正在执行的脚本被分配给消息处理器字段,那么引擎将根据该字段的元数据向 DW 提供预期类型的提示。例如。如果它是 Pojo,那么 DW 将知道要实例化什么 class 并且知道它需要使用 Java Writer,因此用户不需要知道所有这些内部内容。
有趣的部分是当我们不知道 set-payload 时。那么逻辑是这样的:
DW 将查看脚本并查看正在使用的输入,如果它们都是 same/compatible 数据类型,那么它将使用它。这意味着如果在您的脚本中放置
<set-payload value="#[payload.foo]/>
我们将查看有效载荷的类型,如果有效载荷是 Json 那么我们将使用 Json 编写器。现在,如果使用了多个输入并且它们来自不同的数据类型,则会抛出一个错误,即<set-payload value="#[payload.foo ++ vars.bar]/>
是 xml 类型的vars.bar
和payload
类型 Json。因此,有时特别是在 xml 上,您可能会在一组有效负载上编写一个表达式,并且您可能会失败,因为它最终成为无效的 xml(例如多个根)。如果未使用输入,则使用 Java 编写器。所以
<set-payload value="#[{a: true}]/>
将输出带有条目的 java.util.Map ("a", true)
对于
Logger
消息处理器,我们做了一件特殊的事情来避免日志错误。我们尝试使用#3
下的逻辑,但如果因为编写器无法发出该数据结构而失败,那么我们使用 DataWeave 编写器,它可以编写任何可能的数据结构,因为 dw 语言基本上是所有格式的超集它处理(它包含它们的所有功能:对象、数组、名称空间、数字、字符串等...)
希望这能解释清楚