2013-11-14 24 views
2

請幫我解決這個錯誤。我通過mainflow中的會話變量捕獲了原始有效載荷。在出現錯誤的情況下,我有另一個子流程,其中我使用了Message Property TransformerXSLT transformer。所以,當我嘗試把格式錯誤的XML(嘗試創建解析器異常)。在XSLT轉換器拋出錯誤,如「元素類型」messageNamestr1234「必須後跟任一屬性規範,」>「或」/>「」。MULE:如何在MEL中使用CDATA

其實我的邏輯是,在錯誤的情況下,我應該構造XML - 在該領域的其中一個需要捕獲original payload。在所有其他測試場景中,它似乎工作正常(正確生成xml)。但僅限解析器異常,消息不會傳播到隊列中,因爲XSLT引發錯誤。請找我的配置XML

 <flow name="mainFlow" doc:name="MessageFlow" 
    tracking:enable-default-events="true"> 

    <wmq:inbound-endpoint queue="InQUEUE" 
     tracking:enable-default-events="true" connector-ref="WMQ_Connector" 
     doc:name="queue" doc:description="Flow"> 
     <wmq:transaction action="ALWAYS_BEGIN" /> 
    </wmq:inbound-endpoint> 
    <byte-array-to-string-transformer doc:name="Byte Array to String"/> 
    <set-session-variable variableName="originalPayload" value="#[payload]" doc:name="Store_Payload"/> 
    <logger message="***change*#[message.payloadAs(java.lang.Object)]*****" level="INFO" doc:name="Logger"/> 
    <mulexml:dom-to-xml-transformer></mulexml:dom-to-xml-transformer> 
       <set-session-variable variableName="operation" 
     value="#[xpath('fn:local-name(/root/*[2])')]" doc:name="Set_Operation" doc:description="separate Operation"/>  
    .......... 
    <choice-exception-strategy doc:name="Choice Exception Strategy" doc:description="used to differenciate system and application error"> 
     <catch-exception-strategy doc:name="Catch_ApplicationFailure_Messages" 
      when="#[exception.causedBy(org.mule.api.MessagingException)]" doc:description="Catches all the application errors and call the error handling subflow to log the error messages"> 
      <flow-ref name="Common_ErrorHandling_SubFlow" doc:name="Invoke_Common_ErrorHandling_SubFlow" /> 
     </catch-exception-strategy> 

     <rollback-exception-strategy 
      maxRedeliveryAttempts="3" doc:name="Catch_SystemFailure_Messages" doc:description="Message Processor catches system error and tries to retry for 3 times and finally put the message in queue"> 
     ................   
     </rollback-exception-strategy> 
    </choice-exception-strategy> 
</flow> 

    <sub-flow name="Common_ErrorHandling_SubFlow" doc:name="Common_ErrorHandling_SubFlow" 
    tracking:enable-default-events="true"> 

    <logger message="***enetered**" level="INFO" doc:name="Logger"/> 

    <message-properties-transformer 
     doc:name="Catch_MessageProperties" doc:description="Used to capture project and message specific information" scope="outbound"> 

     <add-message-property key="InterfaceName" value="'Requests'" /> 
     <add-message-property key="ProjectName" value="'NewProject'" /> 
     .......... 
     <add-message-property key="JMSMessageID" 
      value="#[header:INBOUND:JMSMessageID]" /> 
     <add-message-property key="MuleMessageID" 
      value="#[header:INBOUND:MULE_MESSAGE_ID]" /> 
     <add-message-property key="ExceptionPayload" 
      value="#[exception]" /> 
     <add-message-property key="originalPayload" value="#[sessionVars.originalPayload]"/> 
    </message-properties-transformer> 
    <byte-array-to-string-transformer doc:name="Byte Array to String"/> 

    <mulexml:xslt-transformer 
     maxIdleTransformers="2" maxActiveTransformers="5" 
     doc:name="Generate_ErrorXmlStructure" xsl-file="XSLTScript.txt" doc:description="XSLT transformer used to generate standard xml message with its scripts"> 
     <mulexml:xslt-text> 
     </mulexml:xslt-text> 

     <mulexml:context-property key="ProjectName" 
      value="#[header:OUTBOUND:ProjectName]" /> 
     ......... 
     <mulexml:context-property key="DetailsExceptionMessage" 
      value="#[header:OUTBOUND:DetailsExceptionMessage]" /> 
     <mulexml:context-property key="OriginalPayload" 
      value="#[header:OUTBOUND:originalPayload]" /> 
     <mulexml:context-property key="MessageInDate" 
      value="#[header:OUTBOUND:MessageInDate]" /> 
     <mulexml:context-property key="InputQueue" 
      value="#[header:OUTBOUND:InputQueue]" /> 
    </mulexml:xslt-transformer> 

    <wmq:outbound-endpoint queue="ERROR" 
     connector-ref="WMQ_Connector" doc:name=".ERROR" doc:description="Used to log error messages"> 
     <wmq:transaction action="ALWAYS_JOIN"/> 
    </wmq:outbound-endpoint> 
</sub-flow> 

假設:既然是解析器例外,XSLT轉換除外標準的XML結構(捕捉有效載荷)。因此,認爲路線CDATA.Not知道怎麼做it.Also試圖在XSLT轉換

 1. <mulexml:context-property key="OriginalPayload" 
      value="#[message.outboundproperies.originalPayloadAs(java.lang.Object)]" /> 
     2.<mulexml:context-property key="OriginalPayload" 
      value="#[header:SESSION:originalPayload]" /> 
     3.<mulexml:context-property key="OriginalPayload" 
      value="#[!CDATA[sessionVars.originalPayload]]" /> 

在上下文屬性的各種選項,但沒有hope.Kindly幫我在這。

@DavidDossot:我添加了我的XLST scipt,並且按照您的建議更改了參數。

 <xsl:stylesheet version="2.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
        <xsl:output omit-xml-declaration="yes" cdata-section-elements="OriginalPayload" /> 
        <xsl:param name="InterfaceName" /> 
        <xsl:param name="ProjectName" /> 
         .......... 
        <xsl:param name="OriginalPayload" /> 
        <xsl:param name="MessageInDate" /> 
        <xsl:template match="*"> 
         <Specific> 
          <ProjectName> 
           <xsl:value-of select="$ProjectName" /> 
          </ProjectName> 
          <InterfaceName> 
           <xsl:value-of select="$InterfaceName" /> 
          </InterfaceName> 
           ....... 
          <OriginalPayload> 
          <xsl:value-of select="$OriginalPayload"/> 
         </OriginalPayload> 
       </Specific> 
        </xsl:template> 
       </xsl:stylesheet> 

還上下文屬性我已經添加

    <mulexml:context-property key="OriginalPayload" 
      value="#[sessionVars.originalPayload]" /> 

我依然面臨着同樣的錯誤。我已經嘗試了多個選項1.刪除omit-xml-declaration 2.在xslt中編輯許多屬性並嘗試。沒有希望。請引導我出錯的地方。

@DavidDossot請找我的輸入XML(刪除>從messageName申請辦理入住手續流程解析器異常行爲)

<?xml version="1.0" encoding="utf-8"?> 
    <root> 
    <header> 
    <messageName>str1234</messageName> 
    <messageId>12345</messageId> 
    <storeNo>123</storeNo> 
    <storeElement>str1</storeElement> 
    <requestDateTime>2012-12-13T12:12:12</requestDateTime> 
    </header> 
    <Request> 
    <messageNamestr1234</messageName> 
    </Request> 
    </root> 

請指引我。

回答

1

由於原來的有效載荷是一個字符串,你應該能夠將其直接與傳遞給XSL-T:

<mulexml:context-property key="OriginalPayload" 
     value="#[sessionVars.originalPayload]" /> 

然後在你的XSL output configuration,把將包含的XML元素的名稱cdata-section-elements

<xsl:output cdata-section-elements="yourElementNameHere"/> 

PS。 header:OUTBOUND已棄用使用message.outboundProperties

+0

Hi @David Dossot - 謝謝。我已經改變了你的建議。仍面臨同樣的問題。我編輯了上面的配置並添加了XLST腳本。請看一眼。提前致謝。 – star

+1

我試過上面的XSL,它工作得很好:'OriginalPayload'被包裝在一個CDATA塊中。你必須有其他問題,但就XSL而言,我的解決方案是有效的。 –

+0

謝謝@DavidDossot。是的,我們可以將有效載荷包裝在CDATA中。但是,只有當我們嘗試解析器錯誤消息時纔會出現問題。我們遇到了像'lineNumber:11; columnNumber:24;元素類型「messageNamestr1234」後面必須有屬性規範,「>」或「/>」。除了解析器異常外,它適用於所有其他異常。一旦消息進入XSLT轉換器,它就會拋出錯誤。我已經編輯上面的配置和給定的輸入xml。請看一眼。提前感謝。 – star