0
votes

I have a Mule Expression Language expression:

<set-payload value="#[message.payload.hasNext() ? message.payload.next(): null]" doc:name="Set Payload"/>
<choice  doc:name="Choice">
  <when expression="#[message.payload != null]">

I am trying to iterate over a ConsumerIterator and am getting the error

Execution of the expression "message.payload.hasNext() ? message.payload.next(): null" failed. (org.mule.api.expression.ExpressionRuntimeException)
org.mule.el.mvel.MVELExpressionLanguage:202 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/expression/ExpressionRuntimeException.html)
6. Execution of the expression "message.payload.hasNext() ? message.payload.next(): null" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: ConsumerIterator (org.mule.api.transformer.TransformerMessagingException)
org.mule.transformer.AbstractTransformer:135 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerMessagingException.html)

My solution to this is to rewrite the code without the message. prefix:

<set-payload value="#[payload.hasNext() ? payload.next(): null]" doc:name="Set Payload"/>
<choice  doc:name="Choice">
  <when expression="#[payload is NullPayload]">
  1. What is the difference between #[message.payload] and #[payload]?

  2. If payload is an instance of NullPayload why doesn't payload.hasNext() throw an Exception?

From what I've read the best practice is to use #[message.payload] instead of #[payload].

I am using Mule 3.6.2.

2

2 Answers

2
votes

There is no difference between message.payload and payload. Payload is a shortcut left there just for compatibility with Mule 2.

From time to time there is an issue here and there about a difference between one and the other, just small nuisances but in this case I believe you should try message.payload is NullPayload.

2
votes

I solved the problem by assigning set-payload to false or an empty String instead of null:

<set-payload value="#[message.payload.hasNext() ? message.payload.next(): 'none']" doc:name="Set Payload"/>

Even assigning null is not valid in batch-steps process, it is better to assign some other String. Now I am able to use #[message.payload]:

<logger message="Query: #[message.payload]" level="INFO" doc:name="Logger"/>