我的骡子流是:
<sfdc:query config-ref="SFDC__DevInt" query="dsql:SELECT Id FROM Account WHERE Name = #[flowVars.Name]" doc:name="Salesforce"/>
<logger message="Select query: #[message.payload]" level="INFO" doc:name="Logger"/>
<foreach doc:name="For Each">
<logger message="#[message.payload]" level="INFO" doc:name="Logger"/>
<logger message="#[message.payload.Id]" level="INFO" doc:name="Logger"/>
</foreach>
以上for循环返回id。而不是循环是否有任何直接的方式获取数据作为迭代器对象?即我需要获得id的值。 for循环中的数据返回:
SFDC:Select query: org.mule.streaming.ConsumerIterator@2f23abf
INFO 2015-06-22 13:10:25,520
{Id=0011100000uPbqeAAC, type=Account}
我将获得单一数据。
我试过#[message.payload.iterator()。hasNext()。next()],但是得到了
Message : Execution of the expression "message.payload.iterator().hasNext().next()" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: ConsumerIterator
Code : MULE_ERROR--2
答案 0 :(得分:8)
sfdc:query
之后的消息有效负载是org.mule.streaming.ConsumerIterator
的实例,它实现java.util.Iterator
。因此,没有理由在其上调用iterator()
, 已经是迭代器。
此外hasNext
返回一个布尔值,而不是Iterator
个实例,因此您无法像调用链接那样进行调用。
因此,你的表达应该是:
#[message.payload.hasNext() ? message.payload.next() : null]
假设null
是枚举为空时所需的值。
答案 1 :(得分:2)
如果需要使用for-each
,也可以将迭代器转换为列表 #[org.apache.commons.collections.IteratorUtils.toList(payload)]