MULE: Как использовать CDATA в MEL
Пожалуйста, помогите мне с этой ошибкой. Я захватил оригинальную полезную нагрузку через переменную сеанса в mainflow. В случае сценария ошибки у меня есть другой подпоток, где я использовал Message Property Transformer
а также XSLT transformer
, Поэтому, когда я пытаюсь поставить неправильно отформатированный xml(пытаясь создать исключение синтаксического анализатора). В XSLT-преобразователе возникает ошибка выдачи типа "Тип элемента"messageNamestr1234", либо спецификации атрибутов, ">"или"/>".
На самом деле моя логика заключается в том, что в случае ошибки я должен построить 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 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>
также в свойствах контекста я добавил
<mulexml:context-property key="OriginalPayload"
value="#[sessionVars.originalPayload]" />
Тем не менее я сталкиваюсь с той же ошибкой. Я пробовал несколько вариантов 1. Удалил omit-xml-декларации 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
конфигурации, поместите имя элемента XML, который будет содержать исходную полезную нагрузку, в cdata-section-elements
:
<xsl:output cdata-section-elements="yourElementNameHere"/>
PS. header:OUTBOUND
не рекомендуется использовать message.outboundProperties
,