【问题标题】:Mule - choice component issueMule - 选择组件问题
【发布时间】:2013-05-12 20:44:23
【问题描述】:

当我运行我的流程时,我收到以下错误 `

<org.apache.cxf.staxutils.DepthXMLStreamReader>
  <reader class="org.mule.module.cxf.support.StreamClosingInterceptor$1">
    <reader class="com.ctc.wstx.sr.ValidatingStreamReader">
      <mXml11>false</mXml11>
      <mInputBuffer>xmlns:ns2=&quot;http://wsdouane/&quot;&gt;&lt;return&gt;&lt;douanePK&gt;&lt;idConteneurId&gt;ctr1&lt;/idConteneurId&gt;&lt;idCritereId&gt;C11&lt;/idCritereId&gt;&lt;/douanePK&gt;&lt;valeurId&gt;oui&lt;/valeurId&gt;&lt;/return&gt;&lt;/ns2:findResponse&gt;&lt;/S:Body&gt;&lt;/S:Envelope&gt;&#x0;&#x0;.................

我们可以从&lt;mInputBuffer&gt; 开始看到正确的soap 响应,有没有办法只获得soap 响应?

这是我的流程

 <flow name="SOAPWebService" doc:name="SOAPWebService">
    <http:inbound-endpoint exchange-pattern="request-response" address="http://localhost:8088/esb" doc:name="HTTP"/>
    <object-to-string-transformer doc:name="Object to String"/>
    <choice doc:name="Choice">
        <when expression="#[payload.contains('C22')]">
            <set-variable variableName="paramCtr" value="#[message.inboundProperties['ctr']]" doc:name="conteneur"/>
            <set-variable variableName="paramC" value="#[message.inboundProperties['c']]" doc:name="critere"/>
            <component class="com.example.components.SampleComponent" doc:name="Java"/>
            <mulexml:xslt-transformer  maxIdleTransformers="2" maxActiveTransformers="5" xsl-file="C:\MuleStudio\SandBox\resources\PrepareRequestXMLPort.xsl" doc:name="XSLT">
                <mulexml:context-property key="paramCtr" value="#[flowVars['paramCtr']]" />
                <mulexml:context-property key="paramC"  value="#[flowVars['paramC']]" />
            </mulexml:xslt-transformer>
            <cxf:proxy-client payload="body" enableMuleSoapHeaders="true" doc:name="SOAP"/>
            <http:outbound-endpoint exchange-pattern="request-response" address="http://localhost:8080/ClientsDB/port" doc:name="PortWS"/>
            <byte-array-to-string-transformer   doc:name="Byte Array to String" />
        </when>
        <otherwise>
            <set-variable variableName="paramCtr" value="#[message.inboundProperties['ctr']]" doc:name="conteneur"/>
            <set-variable variableName="paramC" value="#[message.inboundProperties['c']]" doc:name="critere"/>
            <component class="com.example.components.SampleComponent" doc:name="Java"/>
            <mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" xsl-file="C:\MuleStudio\SandBox\resources\PrepareRequestXMLDouane.xsl" doc:name="XSLT">
                <mulexml:context-property key="paramCtr"  value="#[flowVars['paramCtr']]" />
                <mulexml:context-property key="paramC"  value="#[flowVars['paramC']]" />
            </mulexml:xslt-transformer>                
            <cxf:proxy-client payload="body" enableMuleSoapHeaders="true" doc:name="SOAP"/>
            <http:outbound-endpoint exchange-pattern="request-response" address="http://localhost:8080/ClientsDB/douane" doc:name="DouaneWS"/>
            <byte-array-to-string-transformer doc:name="Byte Array to String"/>
        </otherwise>
    </choice>
    <xm:object-to-xml-transformer doc:name="Object to XML"/>
    <file:outbound-endpoint path="C:\MuleStudio\SandBox\output" outputPattern="#[function:datestamp:dd-MM-yy]_#[function:systime].xml " responseTimeout="10000" doc:name="Outgoing File"/>
</flow>

谢谢。

【问题讨论】:

    标签: http mule mule-studio


    【解决方案1】:

    此表达式 #[payload.contains('c22')] 无法工作,因为有效负载是 InputStream。您没有在 Mule 的日志中看到堆栈跟踪吗?

    无论如何,请尝试在choice 之前添加&lt;object-to-string-transformer /&gt;,看看是否能解决问题。

    编辑:

    问题是您正在使用 XStream(xm:object-to-xml-transformer)将 CXF 响应对象(org.apache.cxf.staxutils.DepthXMLStreamReader)序列化为 XML。 CXF 响应不应该被弄乱,应该在流的响应阶段由cxf:proxy-client 处理。 choice 路由器之后的 xm:object-to-xml-transformerfile:outbound-endpoint 可能会干扰这种机制。尝试将它们包装在choice 路由器上方的response 元素中,以便它们在响应阶段之后执行。

    请注意,我已经在你的另一个问题https://stackoverflow.com/a/16615537/387927 中给了你这个建议,但你没有对此做出反应。

    另外我不认为byte-array-to-string-transformer 做任何事情:http:outbound-endpoints 之后的消息负载应该是org.apache.cxf.staxutils.DepthXMLStreamReader,防止这个转换器触发。

    【讨论】:

    • 我已经测试了这个选择,现在它运行良好,谢谢。我还更新了我的问题中的流程。现在我有另一个输出,你能帮忙吗?谢谢
    • 解决部分问题后修改现有问题的做法很糟糕。我将扩展我的答案以回答,但将来请打开一个新问题。
    • 好的,对不起,我现在知道了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多