(Mods: I checked the other threads similar to mine, but this question is at a deeper level)
I converted a Hello World flow to a flow that accepts a JSON object, and I am attempting to use the 'Choice' flow control node to route it towards one of two 'Set Payload' nodes.
My problem is that I can get the flow Choice node to route to the correct destination node
(I suspect it is a JSON issue)
Below is my flow
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:json="http://www.mulesoft.org/schema/mule/json" version="EE-3.5.0" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:core="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd">
<json:object-to-json-transformer name="Object_to_JSON" doc:name="Object to JSON"/>
<flow doc:name="HelloWorldFlow1" name="HelloWorldFlow1">
<http:inbound-endpoint doc:description="This endpoint receives an HTTP message." doc:name="HTTP" exchange-pattern="request-response" host="localhost" port="8081" contentType="application/json"/>
<choice doc:name="Choice-Determine-Route" tracking:enable-default-events="true">
<when expression="#[payload.uid == 'ABC']">
<set-payload value="#['When ABC case']" doc:name="Set Payload"/>
</when>
<otherwise>
<set-payload value="#['Default case, uid: ' + payload.uid + ', payload: ' + payload]" doc:name="Set Payload"/>
</otherwise>
</choice>
</flow>
</mule>
I am sending the flow the following JSON string
{ "uid" : "ABC" }
So the flow should be able to detect that the uid is equal to 'ABC'
Below is my test program
C:\curl>curl -H "Content-Type: application/json" -i -d @input2.txt http://localh
ost:8081
HTTP/1.1 200 OK
Date: Tue, 15 Jul 2014 09:42:34 -0700
Server: Mule EE Core Extensions/3.5.0
Content-Type: application/json
X-MULE_SESSION: rO0ABXNyACNvcmcubXVsZS5zZXNzaW9uLkRlZmF1bHRNdWxlU2Vzc2lvbi7rdtEW
7GGKAwAFWgAFdmFsaWRMAA1mbG93Q29uc3RydWN0dAAmTG9yZy9tdWxlL2FwaS9jb25zdHJ1Y3QvRmxv
d0NvbnN0cnVjdDtMAAJpZHQAEkxqYXZhL2xhbmcvU3RyaW5nO0wACnByb3BlcnRpZXN0AA9MamF2YS91
dGlsL01hcDtMAA9zZWN1cml0eUNvbnRleHR0ACdMb3JnL211bGUvYXBpL3NlY3VyaXR5L1NlY3VyaXR5
Q29udGV4dDt4cAFwdAAkMDU2OTdkYjEtMGMzZi0xMWU0LWExYjEtMDAyMTVlNmIzZDkwc3IAJWphdmEu
dXRpbC5Db2xsZWN0aW9ucyRTeW5jaHJvbml6ZWRNYXAbc/kJS0s5ewMAAkwAAW1xAH4AA0wABW11dGV4
dAASTGphdmEvbGFuZy9PYmplY3Q7eHBzcgAkb3JnLm11bGUudXRpbC5DYXNlSW5zZW5zaXRpdmVIYXNo
TWFwndHZ72dFzgADAAB4cHcMP0AAAAAAABAAAAAAeHEAfgAJeHB4
X-MULE_ENCODING: UTF-8
Content-Length: 99
Connection: close
Default case, uid: null, payload: org.apache.commons.httpclient.ContentLengthI
nputStream@42884288
As you can see, I sent a uid of 'ABC', but it still goes to the Default case
As you can see within the flow, I print out the relevant payload information in the "Set Payload" node:
#['Default case, uid: ' + payload.uid + ', payload: ' + payload]
... and as you can see from the test program I get the following output from that statement:
Default case, uid: null, payload: org.apache.commons.httpclient.ContentLengthI
nputStream@42884288
2 questions
How can I resolve this so I can hit the 'ABC' route ?
What exactly is "org.apache.commons.httpclient.ContentLengthInputStream@42884288
I know its an input stream, but where is the data ?
Thanks
You can transform the stream using an <object-to-string-transformer />
. To get the string representation of the json. You can also use other transformers such as object-to-byte-array
You then need to transform the json to an object first for the choice expression to work.
<json:json-to-object-transformer returnClass="java.util.HashMap" />