2

このエラーについて助けてください。メインフローのセッション変数を介して元のペイロードをキャプチャしました。エラー シナリオの場合、別のサブフローがあり、そこで と を使用Message Property TransformerXSLT transformerました。そのため、間違った形式の xml を配置しようとすると (パーサー例外を作成しようとしています)。XSLT トランスフォーマーでは、「要素タイプ "messageNamestr1234" の後に属性仕様 ">" または "/>" のいずれかが続く必要があります」のようなエラーがスローされます。

実際、私のロジックは、エラー シナリオでは xml を構築することになっています - ファイルの 1 つをキャプチャする必要があり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 Transformer は標準の xml 構造を除く (ペイロードのキャプチャー時)。そのため、CDATA でルーティングすることを考えました。方法がわからない。また、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]]" />

しかし、希望はありません。親切にこれについて私を助けてください。

@DavidDossot: XLST スクリプトを追加し、提案どおりにパラメーターを変更しました。

      <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>

追加したContextプロパティにも

                    <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>

私を案内してください。

4

1 に答える 1