【问题标题】:Why does Mule ArrayList.contains() gives incorrect value for an empty/null string为什么 Mule ArrayList.contains() 为空/空字符串提供不正确的值
【发布时间】:2013-03-01 05:34:24
【问题描述】:

我的Mule 3.3.0 配置中有一个条件表达式,如下所示:

<when expression="#[places.contains(message.payload)]">

。 . .

</when>

places 是声明为的局部变量

<set-variable variableName="places" value="{'Buenos Aires', 'Córdoba', 'La Plata'}"/>

在执行上述条件表达式之前,有一个XSL 转换器来设置有效负载。如果有效负载不为空,则条件表达式可以正常工作,但在 xsl 转换器不返回结果且 #[payload]empty 的情况下,仍然高于条件语句返回 true

我该如何纠正这个问题?

编辑 XSL 变压器声明为:

<xm:xslt-transformer xsl-file="xsl/getPlaces.xslt" returnClass="java.lang.String"/>

【问题讨论】:

    标签: java arraylist mule


    【解决方案1】:

    你的配置有两个问题:

    • 您用来创建列表的表达式不正确:它实际上只是创建了一个String。改用 MEL 表达式:

      <set-variable variableName="places"
                    value="#[{'Buenos Aires', 'Córdoba', 'La Plata'}]"/>
      
    • 使用 MEL contains 在此位置列表中查找字符串有效负载:

      #[places contains message.payload]
      

    【讨论】:

    • 我编辑了问题以显示 xsl 转换器已经用 returnClass 声明为java.lang.String。我尝试了您的更改,但结果仍然相同。当 xslt 不返回任何结果元素时,#[places.contains(message.payload)]#[places.contains(message.payloadAs(java.lang.String))] 返回 true
    • 我想我发现了第二个问题:places 被定义为String 而不是Strings 的List,因为您没有在set-variable 中使用表达式。
    • 按照上述编辑中的建议更改位置会引发 [Error: unable to resolve method: [Ljava.lang.Object;.contains(java.lang.String) [arglength=1]] [Near : {... Unknown ....}] 异常。现在,places 的类型是 Object 而不是 String。当我首先写它时,我想知道类似的事情,变量如何获得type。但是因为它让我使用List.contains(),我想可能是它基于值的分配类型。
    • 实际上[Ljava.lang.Object 告诉我们places 是对象的List。我不明白为什么.contains() 不起作用。让我们尝试使用 MEL contains,即 #[places contains message.payload]
    • 这与String.equals() 完全一样。虽然我不明白为什么 Mule 中的 List.contains() 会失败,但很高兴 MEL contains 运行良好。感谢 David 的努力,请将其添加到您的答案中,以便我接受。
    【解决方案2】:

    places 变量应该通过以下方式访问:

    #[flowVars['places'].contains(message.payload)]
    

    【讨论】:

    • 这个改变还是一样的结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 2019-04-29
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多