Makavelines
Makavelines

Reputation: 111

Can't do validation because mule doesn't see payload

I'm trying to use validation connector to check value field for outcome "good" or "bad". Even if they are written in capital letters. The issue is when I use the validation connector to check payload.value it shows null. This is not the case when I debug on payload that shows the full payload. How can I solve it?

I have my xml code below:

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

Error:

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

Upvotes: 0

Views: 295

Answers (1)

aled
aled

Reputation: 25664

The problem that you are having is because the first DataWeave transformation -which I understand is used to mock the input- returns an XML string. This is Mule 3 so the validation uses a MEL expression to try to evaluate its input #[payload.Service.Value]. MEL doesn't know how to parse the XML so it fails with an error.

To resolve the issue you need only to transform the input into a Java object that MEL can evaluate. For example putting this transformation between the first Transform and the validate resolves the issue:

<dw:transform-message doc:name="Transform Message">
    <dw:set-payload><![CDATA[%dw 1.0
        %output application/java
        ---
        payload
        ]]>
    </dw:set-payload>
</dw:transform-message> 

Upvotes: 1

Related Questions