将请求负载映射到变量会在 Mule 不可用时抛出异常

Mapping request payload to variable throws exception when not available for Mule

在使用 MULE 时,我将从 HTTP 请求接收到的有效负载转换为 json 对象并将其映射到变量。以防万一,当我不传递其中一个变量时,我会在计算表达式时遇到异常。

 <flow name="test">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/>
    <json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/>
    <set-variable variableName="a"              value="#[message.payload.a]"
    <set-variable variableName="b"              value="#[message.payload.b]"
    <logger message="a:  #[a]" level="INFO" doc:name="Logger"></logger>
</flow>

当负载为

{
    "a": "val1",
    "b": "val2"
}

应用程序运行良好。

但是如果负载是

{
   "b": "val2"
}

我得到以下异常:

 ERROR [].HTTP_Listener_Configuration.worker.01] org.mule.exception.DefaultMessagingExceptionStrategy:
********************************************************************************
Message               : Execution of the expression "a" failed. (org.mule.api.expression.ExpressionRuntimeException).
Payload               : {b="val2"}
Payload Type          : java.util.LinkedHashMap
Element               : /test/processors/10 @ test:test.xml:47 (Logger)
Element XML           : <logger message="a:  #[a]" level="INFO" doc:name="Logger"></logger>
--------------------------------------------------------------------------------
Root Exception stack trace:
[Error: unresolvable property or identifier: a]
[Near : {... a ....}]

我可以检查变量 'a' 的值并将其附加为 NULL 吗?

P.S。我想使用此变量作为其他一些 http 请求的有效负载中的参数之一进行发送。

使用 #[flowVars.a] 而不是 #[a] 将导致 null 而不是异常。

您的实施有问题。在 http 侦听器之后,有效负载是原始响应 (JSON),它无法通过 #[payload.a] 或 #[payload['a']] 以任何方式访问。您应该将 json 添加到对象(将 json 转换为地图)。从这里您可以像这样引用它 #[payload['a']] 或 #[payload.a]