Mule 4自定义策略部署出现SAXParseException问题求助
问题排查:Mule自定义策略部署SAXParseException错误
上传自定义策略实现后部署时触发SAXParseException错误,根据错误日志定位到template.xml存在XML结构问题,以下是错误详情及代码:
错误日志
ERROR 2024-06-17 18:53:05,449 [agw-policy-set-deployment.01] [processor: ; event: ] com.mulesoft.mule.runtime.gw.policies.deployment.DefaultPolicyDeployer: Error deploying policy resource-common-secure-replyto-policy-impl-5402681 to application policy-cdnmvr-process org.mule.runtime.deployment.model.api.policy.PolicyRegistrationException: Error occured registering policy 'resource-common-secure-replyto-policy-impl-5402681 @ policy-cdnmvr-process-api-main' at org.mule.runtime.module.deployment.impl.internal.application.MuleApplicationPolicyProvider.addPolicy(MuleApplicationPolicyProvider.java:113) ~[mule-module-deployment-model-impl-4.4.0-20240520.jar:4.4.0-20240520] ... Caused by: org.xml.sax.SAXParseException; lineNumber: 16; columnNumber: 42; cvc-complex-type.2.4.a: Invalid content was found starting with element '{"http://www.mulesoft.org/schema/mule/core":sub-flow}'. One of '{"http://www.mulesoft.org/schema/mule/core":abstract-message-processor, "http://www.mulesoft.org/schema/mule/core":abstract-mixed-content-message-processor}' is expected. ...
原template.xml代码
<?xml version="1.0" encoding="UTF-8"?> <mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:http-policy="http://www.mulesoft.org/schema/mule/http-policy" xmlns:http-transform="http://www.mulesoft.org/schema/mule/http-policy-transform" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd http://www.mulesoft.org/schema/mule/http-policy http://www.mulesoft.org/schema/mule/http-policy/current/mule-http-policy.xsd http://www.mulesoft.org/schema/mule/http-policy-transform http://www.mulesoft.org/schema/mule/http-policy-transform/current/mule-http-policy-transform.xsd"> <http-policy:proxy name="{{{policyId}}}"> <http-policy:source> <http-policy:execute-next/> <sub-flow name="policy-main"> <choice> <when expression="#[attributes.headers['wmic_common_replyTo'] != null and (attributes.headers['wmic_common_replyTo'] contains 'wmic.ins' or attributes.headers['wmic_common_replyTo'] contains 'guidewire.net')]"> <logger message="Header 'wmic_common_replyTo' is valid: #[attributes.headers['wmic_common_replyTo']]" level="INFO"/> </when> <when expression="#[attributes.headers['wmic_common_replyTo'] == null]"> <logger message="Header 'wmic_common_replyTo' is not present, proceeding without validation" level="INFO"/> </when> <otherwise> <set-variable variableName="policyErrorMessage" value="Invalid 'wmic_common_replyTo' header. Must contain 'wmic.ins' or 'guidewire.net'."/> <raise-error type="POLICY:VALIDATION_ERROR" description="#[vars.policyErrorMessage]"/> </otherwise> </choice> </sub-flow> </http-policy:source> </http-policy:proxy> </mule>
问题原因及修复方案
原因分析
错误日志明确指出:<http-policy:source>节点下只能包含消息处理器(abstract-message-processor)或混合内容消息处理器(abstract-mixed-content-message-processor),直接在该节点下放置<sub-flow>违反了XML Schema的结构约束。
修复方法
有两种可行的修复方式:
方式一:移除<sub-flow>包装,将逻辑内联到<http-policy:source>中
修改后的代码:
<?xml version="1.0" encoding="UTF-8"?> <mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:http-policy="http://www.mulesoft.org/schema/mule/http-policy" xmlns:http-transform="http://www.mulesoft.org/schema/mule/http-policy-transform" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd http://www.mulesoft.org/schema/mule/http-policy http://www.mulesoft.org/schema/mule/http-policy/current/mule-http-policy.xsd http://www.mulesoft.org/schema/mule/http-policy-transform http://www.mulesoft.org/schema/mule/http-policy-transform/current/mule-http-policy-transform.xsd"> <http-policy:proxy name="{{{policyId}}}"> <http-policy:source> <http-policy:execute-next/> <choice> <when expression="#[attributes.headers['wmic_common_replyTo'] != null and (attributes.headers['wmic_common_replyTo'] contains 'wmic.ins' or attributes.headers['wmic_common_replyTo'] contains 'guidewire.net')]"> <logger message="Header 'wmic_common_replyTo' is valid: #[attributes.headers['wmic_common_replyTo']]" level="INFO"/> </when> <when expression="#[attributes.headers['wmic_common_replyTo'] == null]"> <logger message="Header 'wmic_common_replyTo' is not present, proceeding without validation" level="INFO"/> </when> <otherwise> <set-variable variableName="policyErrorMessage" value="Invalid 'wmic_common_replyTo' header. Must contain 'wmic.ins' or 'guidewire.net'."/> <raise-error type="POLICY:VALIDATION_ERROR" description="#[vars.policyErrorMessage]"/> </otherwise> </choice> </http-policy:source> </http-policy:proxy> </mule>
方式二:将<sub-flow>移到<http-policy:proxy>外部,通过<flow-ref>调用
如果需要复用该子流逻辑,可采用此方式:
<?xml version="1.0" encoding="UTF-8"?> <mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:http-policy="http://www.mulesoft.org/schema/mule/http-policy" xmlns:http-transform="http://www.mulesoft.org/schema/mule/http-policy-transform" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd http://www.mulesoft.org/schema/mule/http-policy http://www.mulesoft.org/schema/mule/http-policy/current/mule-http-policy.xsd http://www.mulesoft.org/schema/mule/http-policy-transform http://www.mulesoft.org/schema/mule/http-policy-transform/current/mule-http-policy-transform.xsd"> <sub-flow name="policy-main"> <choice> <when expression="#[attributes.headers['wmic_common_replyTo'] != null and (attributes.headers['wmic_common_replyTo'] contains 'wmic.ins' or attributes.headers['wmic_common_replyTo'] contains 'guidewire.net')]"> <logger message="Header 'wmic_common_replyTo' is valid: #[attributes.headers['wmic_common_replyTo']]" level="INFO"/> </when> <when expression="#[attributes.headers['wmic_common_replyTo'] == null]"> <logger message="Header 'wmic_common_replyTo' is not present, proceeding without validation" level="INFO"/> </when> <otherwise> <set-variable variableName="policyErrorMessage" value="Invalid 'wmic_common_replyTo' header. Must contain 'wmic.ins' or 'guidewire.net'."/> <raise-error type="POLICY:VALIDATION_ERROR" description="#[vars.policyErrorMessage]"/> </otherwise> </choice> </sub-flow> <http-policy:proxy name="{{{policyId}}}"> <http-policy:source> <http-policy:execute-next/> <flow-ref name="policy-main"/> </http-policy:source> </http-policy:proxy> </mule>
验证说明
两种方式都符合Mule自定义策略的XML Schema约束,可根据实际需求选择。部署前建议先在Anypoint Studio中验证XML语法,避免结构错误。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

