【问题标题】:How to set String value in Mule variables如何在 Mule 变量中设置字符串值
【发布时间】:2015-07-21 15:08:35
【问题描述】:

我想在流变量中存储一个表达式,并想像我存储的那样检索它.... 例如:-

<set-variable doc:name="Variable" value="#[xpath('//v1:insertDataRequest/v1:Id').text]" variableName="cacheKey"/> 

在名为 cacheKey 的流变量中,我想将表达式 #[xpath('//v1:insertDataRequest/v1:Id').text] 存储为字符串,这样如果我想检索它,如下所示

&lt;logger message="#[flowVars['cacheKey']" level="INFO" doc:name="Logger"/&gt;

它应该将#[flowVars['cacheKey'] 的值作为#[xpath('//v1:insertDataRequest/v1:Id').text] 作为字符串检索到我

但就我而言,每当我尝试存储时

 <set-variable doc:name="Variable" value="#[xpath('//v1:insertDataRequest/v1:Id').text]" variableName="cacheKey"/>

它使用 current message payload 提取 xpath 值,我从有效负载中获取 xpath 的提取值,而不是获取 #[xpath('//v1:insertDataRequest/v1:Id').text]

所以,我的问题是如何将值 #[xpath('//v1:insertDataRequest/v1:Id').text] 存储为 flowVars 中的字符串,以便我得到准确的 #[xpath('//v1:insertDataRequest/v1:Id').text] 作为 flowVars 值,而不是 xpath提取值 /强> 请帮忙

【问题讨论】:

    标签: xpath mule


    【解决方案1】:

    这应该可行:

     <set-variable doc:name="Variable" value="#['#[xpath('//v1:insertDataRequest/v1:Id').text]']" variableName="cacheKey"/>
    

    编辑:

    撇号应该被转义

    <set-variable doc:name="Variable" value="#['#[xpath(\'//v1:insertDataRequest/v1:Id\').text]']" variableName="cacheKey"/>
    

    【讨论】:

    • 我尝试了你的表达,当我尝试使用记录器检索值时:- &lt;logger message="Value :- #[flowVars['cacheKey']]" level="INFO"/&gt; .. 我只得到以下内容:- Value :- #[xpath( ... 奇怪.. 我没有得到完整的表达
    • @AnirbanSenChowdhary 抱歉,内部撇号应该被转义。用正确的代码编辑了答案。
    • 我来晚了,我第一次读得很糟糕,但是鉴于MVEL中没有'eval',您希望如何在Mule MVEL上下文中执行该表达式?
    • @VíctorRomero 目的不是评估表达式,而是将其字符串表示形式存储在变量中
    • 哦,就是这样!他们唯一真正需要的是将#与[分开,否则像前面提到的那样转义就可以了。
    【解决方案2】:

    没有像 eval 这样的东西可以重用 MVEL 中的当前上下文,因此即使您按照 ~nuno 存储值(或者只是以某种方式将 # 与 [ 分开,可能使用字符串附加程序),您将无法执行。

    我看不到您问题的大局,但我猜我会使用 property placeholder 而不是 property placeholder 以及您需要能够自定义的表达式。

    对于部分问题,您指出您不想丢失有效负载,只需使用enritcher,它就是为此而设计的,任何阅读它的人都会很快理解您的意图做。

    【讨论】:

    • 嗨,如果我使用上面的表达式,我将在 flowVars 中获取提取的值,因为这里的 xpath 正在使用作为 SOAP 请求的当前有效负载执行.. . 所以我会得到提取值而不是得到#[xpath('//v1:insertDataRequest/v1:Id').text]...但是这里我需要flowVars中的#[xpath('//v1:insertDataRequest/v1:Id').text]而不是提取值...请建议如何实现这一点
    • 哦!我完全误解了这个问题。让我更新答案。
    • 谢谢 Victor .. 是的,我可以使用你所说的占位符 .. 但我的目的是存储表达式本身,因为我需要在我正在评估 xpath 的拦截器 java 类中传递表达式在 Java 代码中并在 Java 代码中获取 flowvars...非常感谢您的帮助
    • 抱歉误读。这听起来很复杂,请确保您确实需要做类似的事情:组件绑定、丰富器、组件注释和其他可能是一种更简单的方法。
    • Romero :- 当然是维克多 .. 我会记住您的建议 .. 感谢您的支持 :)
    【解决方案3】:

    所以最后正如努诺建议的那样,可行的解决方案是:-

    <set-variable doc:name="Variable" value="#['#[xpath(\'//v1:insertDataRequest/v1:Id\').text]']" variableName="cacheKey"/>
    

    【讨论】:

      【解决方案4】:

      您可以通过以下方式替换 set-variable 标记:

      <expression-component>
          flowVars.cacheKey = "#[xpath('//v1:insertDataRequest/v1:Id').text]";
      </expression-component>
      

      【讨论】:

      • 这有点矫枉过正,set-variable 更快且不言自明
      • 我尝试使用 set-variable 但它不起作用。在这种情况下,我认为表达式组件符合要求,但如果有其他方法,我会注意线程。
      • 是的,这种方式也有效......但正如维克多所说,设置变量会更快,并且 Nuno 显示的设置变量中的表达式也在工作..所以我选择它作为答案..但是这也有效,我发现它是一种很好的替代方法...为您的努力+1,非常感谢您的支持:).. 我将在我的代码中将此解决方案标记为替代方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多