Java 为什么Mule ArrayList.contains()为空/空字符串提供了不正确的值

Java 为什么Mule ArrayList.contains()为空/空字符串提供了不正确的值,java,arraylist,mule,Java,Arraylist,Mule,在我的Mule 3.3.0配置中有一个条件表达式,如下所示: <when expression="#[places.contains(message.payload)]"> 在执行上述条件表达式之前,有一个设置有效负载的XSL转换器。如果负载为非空,条件表达式可以正常工作,但在xsl transformer不返回结果且#[payload]为空的情况下,仍然在条件语句上方返回true 我怎样才能纠正这个问题 编辑 XSL转换器声明为: <xm:xslt-transformer

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

<when expression="#[places.contains(message.payload)]">
在执行上述条件表达式之前,有一个设置有效负载的
XSL
转换器。如果负载为非空,条件表达式可以正常工作,但在xsl transformer不返回结果且
#[payload]
空的情况下,仍然在条件语句上方返回
true

我怎样才能纠正这个问题

编辑
XSL
转换器声明为:

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

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

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

您的配置有两个问题:

  • 用于创建列表的表达式不正确:它实际上只是创建了一个
    字符串。改用MEL表达式:

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

我编辑了这个问题,以表明xsl transformer已经用returnClass声明为
java.lang.String
。我试过你的零钱,但结果还是一样
#[places.contains(message.payload)]
#[places.contains(message.payloadAs(java.lang.String))]
返回
true
当xslt不返回任何结果元素时,我想我发现了第二个问题:
places
被定义为
字符串
而不是
字符串
列表
,因为在
设置变量
中没有使用表达式。将places更改为上述编辑中建议的位置会引发
[错误:无法解析方法:[Ljava.lang.Object;.contains(java.lang.String)[arglength=1]][Near:{…未知..}]
异常。现在,places的类型是
Object
而不是
String
。当我首先编写它时,我想知道类似的事情,变量如何获得
类型
。但是当它允许我使用
List.contains()
时,我认为可能是它基于值的赋值类型。实际上
[Ljava.lang.Object
告诉我们
位置
是一个
对象列表
。我不明白为什么
.contains()
对它不起作用。让我们试试MEL
包含
,即
#[places contains message.payload]
。它的工作原理与
字符串等于()
。虽然我不明白为什么Mule中的
List.contains()
失败,但很高兴
MEL contains
工作正常。感谢David对此进行研究,请将此添加到您的答案中,以便我可以接受。此更改的结果仍然相同
#[flowVars['places'].contains(message.payload)]
<set-variable variableName="places"
              value="#[{'Buenos Aires', 'Córdoba', 'La Plata'}]"/>
#[places contains message.payload]