转换Mule HttpRequest' GET'响应

时间:2016-02-23 21:31:54

标签: java json http mule esb

我正在Mule中对我自己的REST API进行httpRequest GET 调用,我希望能够将结果转换为JSONArray。我调用的服务配置为返回JSON,但在处理mule中的 payload 时,它被视为BufferInputString。

以下是代码:

<http:request config-ref="HTTP_Request_Configuration" path="muletest" method="GET" metadata:id="ccb5da53-5418-9753-8399-bb6f8a792f0a" doc:name="HTTP">
        <http:request-builder>
            <http:query-param paramName="firstname" value="#[payload.firstname]"/>
            <http:query-param paramName="lastname" value="#[payload.lastname]"/>
        </http:request-builder>
</http:request>
<set-variable variableName="existingAppointment" value="#[payload]" encoding="UTF-8" mimeType="text/json" metadata:id="40cc3baf-834e-4a82-86db-2779fb736565" doc:name="Get Result"/>
<logger message="GET RESULT: #[payload.get(0)]" level="INFO" metadata:id="5b634d23-af82-4160-8351-4360aa3b3edf" doc:name="Log Get Result" />

每当我尝试调用#[payload.get(0)] 来记录我从调用中得到的结果jsonArray时,我有这个例外:

ERROR 2016-02-23 16:23:00,673 [[omdcrv3].omdcrv3Flow.stage1.02] org.mule.exception.CatchMessagingExceptionStrategy: 
Message               : Execution of the expression "payload.get(0)" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: BufferInputStream
Type                  : org.mule.api.MessagingException
Code                  : MULE_ERROR--2
Payload               : org.glassfish.grizzly.utils.BufferInputStream@5d838090
JavaDoc               : http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MessagingException.html
********************************************************************************
Exception stack is:
1. [Error: unable to resolve method: org.glassfish.grizzly.utils.BufferInputStream.get(java.lang.Integer) [arglength=1]]
[Near : {... payload.get(0) ....}]

这显然意味着它正在尝试处理BufferInputStream类型的对象,但我不明白我怎么想将这种类型转换为JSON类型...

我确定我做错了什么(我是骡子的新手),但无法弄清楚是什么......

****编辑显示我的解决方案****

Here is my SOLUTION

4 个答案:

答案 0 :(得分:2)

即使对象类型是BufferInputStream,如果你将implicit val formats: Formats = DefaultFormats + FieldSerializer[scala.collection.mutable.Map[String, Int]]() + FieldSerializer[IntPane](ignore("duration")) + FieldSerializer[IntPane](ignore("default")) 放入记录器(或者评估Mule表达式,Ctrl + Shift + I,当调试时),你将获得字符串形式的JSON。

为了进一步评估,将#[payload]放入记录器,您还将获得JSON。 e.g:

#[json:]

然后修改表达式成为{ "flights": [ { "code": "ER38sd", "origin": "MUA", "destination": "SFO" }, { "code": "ER39rk", "origin": "MUA", "destination": "SFO" } ] } ,你将获得一个ArrayList(以String形式的JSON数组)

答案 1 :(得分:1)

您必须将HttpResponse从JSON转换为Map,以便您可以在mule表达式中访问它:

 <json:json-to-object-transformer returnClass="java.util.HashMap" /> 
 <logger message="GET RESULT: #[payload.get(0)]" level="INFO" doc:name="Log Get Result" />

答案 2 :(得分:0)

您好,您可以在http请求后使用Dataweave(转换消息)

%dw 1.0
%output application/json
---
payload[0]

请注意,您可以将输出替换为

%output application/java

生成的有效负载将是LinkedHashMap的实例

答案 3 :(得分:-1)

将一个&#39;对象用于JSON&#39;变压器。这应该有用。