Mule验证连接器读取Payload字段值为空的问题解决咨询
问题:Validation Connector读取XML Payload字段返回空值的解决办法
问题描述
尝试使用Validation Connector检查Value字段的值是否为“good”或“bad”(支持大小写形式),但通过表达式#[payload.Service.Value]检查时返回空值,调试时能看到完整的Payload,执行时报空指针异常。
原Mule XML代码
<?xml version="1.0" encoding="UTF-8"?> <mule xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:validation="http://www.mulesoft.org/schema/mule/validation" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd http://www.mulesoft.org/schema/mule/validation http://www.mulesoft.org/schema/mule/validation/current/mule-validation.xsd http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd"> <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/> <flow name="testFlow"> <http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP"/> <dw:transform-message doc:name="Transform Message"> <dw:set-payload><![CDATA[%dw 1.0 %output application/xml --- {Service: { Id: "N2K99", Value: "good" } }]]></dw:set-payload> </dw:transform-message> <validation:matches-regex value="#[payload.Service.Value]" regex="^(good|bad)" doc:name="Validate good or bad string"/> <dw:transform-message doc:name="Transform Message"> <dw:set-payload><![CDATA[%dw 1.0 %output application/json --- { succes: hallo }]]></dw:set-payload> </dw:transform-message> </flow> </mule>
报错信息
Message : Execution of the expression "payload.Service.Value" failed. (org.mule.api.expression.ExpressionRuntimeException). Payload : <?xml version='1.0' encoding='UTF-8'?> <Service> <Id>N2K99</Id> <Value>good</Value> </Service> Element : /testFlow/processors/1 @ so-validate-regex -------------------------------------------------------------------------------- Root Exception stack trace: java.lang.NullPointerException at org.mule.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:440) at org.mule.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:212) at org.mule.mvel2.ast.ASTNode.optimize(ASTNode.java:160) at org.mule.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:116) at org.mule.mvel2.MVELRuntime.execute(MVELRuntime.java:86) at org.mule.mvel2.compiler.CompiledExpression.getDirectValue(CompiledExpression.java:123) at org.mule.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:119) at org.mule.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:113) at org.mule.mvel2.MVEL.executeExpression(MVEL.java:953) at org.mule.el.mvel.MVELExpressionExecutor.execute(MVELExpressionExecutor.java:87) at org.mule.el.mvel.MVELExpressionLanguage.evaluateInternal(MVELExpressionLanguage.java:228) at org.mule.el.mvel.MVELExpressionLanguage.evaluate(MVELExpressionLanguage.java:163) at org.mule.el.mvel.MVELExpressionLanguage.evaluate(MVELExpressionLanguage.java:142) at org.mule.expression.DefaultExpressionManager.evaluate(DefaultExpressionManager.java:217) at org.mule.expression.DefaultExpressionManager.evaluate(DefaultExpressionManager.java:188) at org.mule.util.AttributeEvaluator.resolveValue(AttributeEvaluator.java:124) at org.mule.module.extension.internal.runtime.resolver.TypeSafeExpressionValueResolver$PassThroughEvaluatorDelegate.resolveValue(TypeSafeExpressionValueResolver.java:147) at org.mule.module.extension.internal.runtime.resolver.TypeSafeExpressionValueResolver$CaptureContextEvaluatorDelegate.resolveValue(TypeSafeExpressionValueResolver.java:137) ...
解决方案
问题根源
当前Payload是XML格式,MVEL表达式(#[...]默认使用MVEL)无法通过.直接访问XML节点——MVEL的.语法仅适用于Java对象(POJO),而XML在Mule中默认以DOM对象形式存在,需要用XML专用的解析方式提取值。
方法一:使用XPath表达式提取节点值
修改Validation Connector的value属性为XPath表达式,同时给正则添加不区分大小写的修饰符:
<validation:matches-regex value="#[xpath('/Service/Value/text()')]" regex="(?i)^(good|bad)$" doc:name="Validate good or bad string"/>
xpath('/Service/Value/text()'):通过XPath精准提取<Value>节点的文本内容(?i):正则修饰符,开启不区分大小写匹配$:正则结尾锚点,确保匹配完整字符串
方法二:用DataWeave表达式提取值
利用DataWeave可以直接解析XML的特性,在表达式中调用DataWeave获取值:
<validation:matches-regex value="#[dw('payload.Service.Value')]" regex="(?i)^(good|bad)$" doc:name="Validate good or bad string"/>
DataWeave会自动处理XML结构,正确提取Value字段的内容。
修正后的完整Flow示例
<flow name="testFlow"> <http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP"/> <dw:transform-message doc:name="Transform Message"> <dw:set-payload><![CDATA[%dw 1.0 %output application/xml --- {Service: { Id: "N2K99", Value: "good" } }]]></dw:set-payload> </dw:transform-message> <!-- 使用XPath的修正版本 --> <validation:matches-regex value="#[xpath('/Service/Value/text()')]" regex="(?i)^(good|bad)$" doc:name="Validate good or bad string"/> <dw:transform-message doc:name="Transform Message"> <dw:set-payload><![CDATA[%dw 1.0 %output application/json --- { succes: "hallo" }]]></dw:set-payload> </dw:transform-message> </flow>
内容的提问来源于stack exchange,提问作者Makavelines
相关产品推荐
相关产品推荐

