【问题标题】:Mule: transform the results of outbound-endpointMule:转换 outbound-endpoint 的结果
【发布时间】:2013-11-28 04:30:01
【问题描述】:

以下流程将传入的 JSON 有效负载转换为 SOAP 消息,该消息在子流程中用于发出 Web 服务请求。一切正常——我能够为原始(传入)请求发回响应,但我想添加最后一步,在将 SOAP 结果发送回客户端之前将其转换为 JSON。

流程如下:

<mule ...>
    <data-mapper:config name="json2xml_grf" transformationGraphPath="json2xml.grf" doc:name="DataMapper"/>
    <flow name="simpleFlow" doc:name="simpleFlow">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP"/>
        <set-property propertyName="Access-Control-Allow-Origin" value="*" doc:name="Property"/>
        <choice doc:name="Choice">
            <when expression="#[message.inboundProperties['http.method'] != 'OPTIONS']">
                <data-mapper:transform config-ref="json2xml_grf" doc:name="DataMapper"/>
                <flow-ref name="invokeCalculatorService" doc:name="invokeCalculator"/>
            </when>
            <otherwise>
                <http:response-builder status="200" doc:name="HTTP Response Builder">
                ...
                </http:response-builder>
            </otherwise>
        </choice>
    </flow>
    <flow name="invokeService" doc:name="invokeService">
        <cxf:proxy-client payload="body" enableMuleSoapHeaders="true" doc:name="Proxy Client">
        </cxf:proxy-client>
        <mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" xsl-file="/Users/jsleeuw/MuleStudio/workspace/calc/src/main/resources/transformsoap.xslt" doc:name="XSLT"/>
        <http:outbound-endpoint exchange-pattern="request-response" doc:name="CalculatorService" method="POST" host="service-host" port="30001"/>
    </flow>
</mule>

像这样在子流的末尾放置一个 DataMapper:

...
<flow-ref name="invokeCalculatorService" doc:name="invokeCalculator"/>
<data-mapper:transform config-ref="xml2json_grf" doc:name="DataMapper"/>
...

导致此错误:

********************************************************************************
Message               : Error executing graph: ERROR (com.mulesoft.mule.module.datamapper.api.exception.DataMapperExecutionException). Message payload is of type: DepthXMLStreamReader
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Content is not allowed in prolog. (org.xml.sax.SAXParseException)
  org.apache.xerces.util.ErrorHandlerWrapper:-1 (null)
2. org.xml.sax.SAXParseException: Content is not allowed in prolog. (net.sf.saxon.trans.DynamicError)
  net.sf.saxon.event.Sender:308 (null)
3. XPath evaluation failed (org.jetel.exception.JetelRuntimeException)
  org.jetel.component.tree.reader.xml.XmlXPathEvaluator:81 (null)
4. Error executing graph: ERROR (com.mulesoft.mule.module.datamapper.api.exception.DataMapperExecutionException)
  com.mulesoft.mule.module.datamapper.impl.DefaultGraphExecutor:83 (null)
5. Error executing graph: ERROR (com.mulesoft.mule.module.datamapper.api.exception.DataMapperExecutionException). Message payload is of type: DepthXMLStreamReader (com.mulesoft.mule.module.datamapper.processors.DataMapperMessageExecutionException)
  com.mulesoft.mule.module.datamapper.processors.DataMapperMessageProcessor:135 (null)
-------------------------------------------------------------------------------- 

而将数据映射器放在子流的末尾最终会阻塞响应。

我应该如何转换我的回复?

【问题讨论】:

    标签: mule mule-studio


    【解决方案1】:

    Content is not allowed in prolog 异常看来,&lt;flow-ref name="invokeCalculatorService" /&gt; 没有返回可解析为 XML 的有效负载。

    此子流程返回一个org.apache.cxf.staxutils.DepthXMLStreamReader,即javax.xml.stream.XMLStreamReader。我所知道的唯一可以将这种类型反序列化为 XML 字符串的转换器是:&lt;mulexml:dom-to-xml-transformer /&gt;

    你能在 data-mapper 元素之前添加一个吗?

    【讨论】:

    • hmm.. 看起来我得到了一个字节数组:cl.ly/image/2Q3G3b2x1K2V。我第一次使用调试器,信不信由你.. 方便!
    • 酷 :) 你介意在 data-mapper 元素之前添加 &lt;byte-array-to-string-transformer /&gt; 吗?
    • 好的,这里有几个来自调试器控制台的截图。首先显示字节数组到字符串转换器上的断点:cl.ly/image/3M17373X2U1N,这是我在字节数组到字符串转换器之后立即添加的回显上的断点:cl.ly/image/3T250N1h2W2D。仍然没有得到预期的结果嗯。 :(
    • 哦,是的,现在有效负载是一个等于“org.mule.module.cxf...”的字符串,不会工作:$ invokeCalculatorService 流里面有什么?问题中没有显示。
    • oops..invokeCalculatorService 的内容与invokeService 相同。这是一个非常简单的网络服务调用。
    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2016-11-04
    • 1970-01-01
    相关资源
    最近更新 更多