【问题标题】:Mule Esb 3.2.1: gathering the results of a splitter and outputting results as XMLMule Esb 3.2.1:收集拆分器的结果并将结果输出为 XML
【发布时间】:2012-03-06 09:34:29
【问题描述】:

我一直在通过 SO 和 Mule 论坛苦苦挣扎,但找不到有效的解决方案。 esb 接收一个包含 id 的请求,该请求创建一个 XML 有效负载,该有效负载由相关 id 列表组成。然后这个 XML 有效负载被拆分并发送到一个转换器,该转换器采用每个相关的 id 来获取一些元数据。然后应该将结果组合在一起以生成 XML 响应。我遇到的问题是,无论我如何转换最终结果集,我总是用封装字符串 "??sr)java.util.concurrent.CopyOnWriteArrayListx]....""x

任何想法/cmets 将不胜感激。

这是我正在使用的 mule 配置:


<http:connector name="HttpConnector" doc:name="HTTP\HTTPS"/>
<expression-transformer name="ExtractId" doc:name="Expression">
    <return-argument evaluator="xpath" expression="//string[1]"/>
</expression-transformer>
<flow name="myFlow1" doc:name="myFlow1">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="incoming/path/" connector-ref="HttpConnector" doc:name="HTTP"/>
    <custom-transformer encoding="UTF-8" class="mycomponents.transformers.SubscriberRequestTransformer" doc:name="Create Hub Id Requests"/>
    <mulexml:object-to-xml-transformer doc:name="Object to XML"/>

    <splitter evaluator="xpath" expression="//entry/list/string" enableCorrelation="ALWAYS" doc:name="Splitter"/>
    <transformer ref="ExtractId" doc:name="Transformer Reference"/>
    <logger message="#[payload:]" level="INFO" doc:name="Logger"/>
    <custom-transformer encoding="UTF-8" class="mycomponents.transformers.HubQueryProcessor" doc:name="Create Hub Id Requests"/>
    <collection-aggregator />
    <component  class="mycomponents.TopicResponseAggregatorComponent" doc:name="Collect requests" />
    <logger message="Aggregated Content (#[groovy:payload.size()] elements): \n#[payload:]" level="INFO" doc:name="Logger"/>        
    <logger message="#[payload:]" level="INFO" doc:name="Logger"/>

</flow>

我已经解决了这个问题。虽然我不太明白为什么它不同,但我假设它与一些骡子“魔法”有关。我将流程分成多个流程,这就是我最终要做的事情。但是,通过这样做,问题就消失了。

仅供参考:这是更新的流程:

<flow name="myFlow1" doc:name="myFlow1">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="url/for/service/" connector-ref="HttpConnector" doc:name="HTTP"/>
    <flow-ref name="createHubIdRequestsFlow" doc:name="Map To Hub Ids" doc:description="Takes in the situation id passed in by the client.  Does the query lookup versus the content mapping tables.  creates the correspondng requests for meta data information to the provider(s)"/>
    <flow-ref name="getTopicRequests" doc:name="Process Provider Reponses" doc:description="For each JSON response returned from the provider, transform it into an XML representation of that data"/>
    <flow-ref name="buildResponseFlow" doc:name="Build final response" doc:description="piece all the messages together into a single object as a string"/>

    <response>
        <message-properties-transformer>
            <add-message-property value="text/xml" key="Content-Type" />
        </message-properties-transformer>
    </response>
</flow>

【问题讨论】:

    标签: esb mule


    【解决方案1】:

    默认情况下,消息属性转换器将新属性存储在“调用”范围内。您需要在“出站”范围内设置内容类型,以便入站 HTTP 端点在其响应阶段使用它。

    试试这个:

        <response>
            <message-properties-transformer scope="outbound">
                <add-message-property value="text/xml" key="Content-Type" />
            </message-properties-transformer>
        </response>
    

    【讨论】:

    • 不,这行不通。它所做的只是逃避所有标签。如果我在工作流结束之前将有效负载输出到控制台,一切看起来都很好。它返回我想要的 XML。但在那之后,它返回由 ??sr)java.util.concurrent.CopyOnWriteArrayListx]?F??xpwt? x
    • 您的建议将输出转义为“ 中的所有标签都已转义。
    • 您能否编辑您的问题并发布与 myFlow1 进行一次交互的日志内容?出于隐私原因,您可以编辑 XML。
    • 我已通过将流程拆分为单独的流程并单独调用它们来解决此问题。现在的问题是它将 XML 作为纯文本而不是 XML 返回。如果我将内容类型更改为“text/xml”或“application/xml”,我什么也得不到。如果我保持原样,它会返回 XML,但浏览器会将其解释为纯文本而不是 XML。 Safari 或 chrome 中不显示任何控件。
    • 请显示您的最新配置以及您如何将响应内容类型设置为 application/xml。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多