0

次のフローは、受信する 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)
-------------------------------------------------------------------------------- 

一方、サブフローの最後にデータマッパーを配置すると、応答がブロックされます。

応答を変換するにはどうすればよいですか?

4

1 に答える 1

1

Content is not allowed in prolog例外から、<flow-ref name="invokeCalculatorService" />XML として解析可能なペイロードが返されないようです。

このサブフローは、 である を返しorg.apache.cxf.staxutils.DepthXMLStreamReaderますjavax.xml.stream.XMLStreamReader。この型を XML 文字列に逆シリアル化できる、私が知っている唯一のトランスフォーマーは次のとおり<mulexml:dom-to-xml-transformer />です。

data-mapper要素の直前に追加できますか?

于 2013-05-29T17:39:12.830 に答える