【问题标题】:Transforming Mule HttpRequest 'GET' Response转换 Mule HttpRequest 'GET' 响应
【发布时间】:2016-02-25 00:03:02
【问题描述】:

我正在 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 类型...

我确定我做错了什么(我是 mule 新手)但不知道是什么...

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

【问题讨论】:

    标签: java json http mule esb


    【解决方案1】:

    即使对象类型是 BufferInputStream,如果您在记录器中输入#[payload](或 Evaluate Mule Expression,Ctrl + Shift + I,在调试时),您将获得字符串形式的 JSON。

    如需进一步评估,请将#[json:] 放入记录器中,您还将获得 JSON。例如:

    {
      "flights": [
        {
          "code": "ER38sd",
          "origin": "MUA",
          "destination": "SFO"
        },
        {
          "code": "ER39rk",
          "origin": "MUA",
          "destination": "SFO"
        }
      ]
    }
    

    然后将表达式修改为#[json:flights],会得到一个ArrayList(String形式的JSON数组)

    【讨论】:

      【解决方案2】:

      您必须将 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" />
      

      【讨论】:

        【解决方案3】:

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

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

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

        %output application/java
        

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

        【讨论】:

        • 我接受了这个答案,因为它引导我找到了解决方案。我使用 Dtaweave 转换器将 JSONArray 转换为 Map 并将输出设置为 application/java 并且它可以工作。
        【解决方案4】:

        使用“对象到 JSON”转换器。应该可以的。

        【讨论】:

        • 我认为应该改用json:json-to-object-transformer
        • 对不起,这就是我的意思 - 传入的有效负载是 JSON,所以它应该是 JSON 到对象的转换器。谢谢@sulthonyh
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        相关资源
        最近更新 更多