This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 351013beb2cd500708db9c65db26daf67bd6b043
Author: Guillaume Nodet <gno...@gmail.com>
AuthorDate: Mon Feb 10 20:19:50 2020 +0100

    Introduce reifiers for expressions
---
 .../model/ExpressionSubElementDefinition.java      |  48 +----
 .../apache/camel/model/RouteDefinitionHelper.java  |  17 +-
 .../camel/model/language/ExpressionDefinition.java | 162 +++--------------
 .../camel/model/language/JsonPathExpression.java   |  62 -------
 .../camel/model/language/MethodCallExpression.java |  48 -----
 .../model/language/NamespaceAwareExpression.java   |  18 --
 .../camel/model/language/SimpleExpression.java     |  31 ----
 .../camel/model/language/TokenizerExpression.java  |  43 -----
 .../model/language/XMLTokenizerExpression.java     |  31 +---
 .../camel/model/language/XPathExpression.java      | 112 ++----------
 .../camel/model/language/XQueryExpression.java     |  40 +----
 .../org/apache/camel/reifier/AbstractReifier.java  |  21 +++
 .../org/apache/camel/reifier/AggregateReifier.java |   8 +-
 .../org/apache/camel/reifier/CatchReifier.java     |   2 +-
 .../org/apache/camel/reifier/DelayReifier.java     |   7 +-
 .../apache/camel/reifier/DynamicRouterReifier.java |   2 +-
 .../org/apache/camel/reifier/EnrichReifier.java    |   2 +-
 .../apache/camel/reifier/ExpressionReifier.java    |   2 +-
 .../camel/reifier/IdempotentConsumerReifier.java   |   2 +-
 .../java/org/apache/camel/reifier/LoopReifier.java |   4 +-
 .../apache/camel/reifier/OnCompletionReifier.java  |   2 +-
 .../apache/camel/reifier/OnExceptionReifier.java   |  19 +-
 .../apache/camel/reifier/PollEnrichReifier.java    |   2 +-
 .../apache/camel/reifier/RecipientListReifier.java |   2 +-
 .../apache/camel/reifier/ResequenceReifier.java    |   4 +-
 .../apache/camel/reifier/RoutingSlipReifier.java   |   2 +-
 .../org/apache/camel/reifier/ScriptReifier.java    |   2 +-
 .../org/apache/camel/reifier/SetBodyReifier.java   |   2 +-
 .../org/apache/camel/reifier/SetHeaderReifier.java |   2 +-
 .../apache/camel/reifier/SetPropertyReifier.java   |   2 +-
 .../java/org/apache/camel/reifier/SortReifier.java |   2 +-
 .../org/apache/camel/reifier/SplitReifier.java     |   2 +-
 .../org/apache/camel/reifier/ThrottleReifier.java  |  11 +-
 .../org/apache/camel/reifier/TransformReifier.java |   2 +-
 .../org/apache/camel/reifier/ValidateReifier.java  |   2 +-
 .../org/apache/camel/reifier/WireTapReifier.java   |   2 +-
 .../camel/reifier/language/ExpressionReifier.java  | 200 +++++++++++++++++++++
 .../language/JsonPathExpressionReifier.java        |  58 ++++++
 .../language/MethodCallExpressionReifier.java      |  64 +++++++
 .../reifier/language/SimpleExpressionReifier.java  |  54 ++++++
 .../language/TokenizerExpressionReifier.java       |  73 ++++++++
 .../language/XMLTokenizerExpressionReifier.java    |  66 +++++++
 .../reifier/language/XPathExpressionReifier.java   |  69 +++++++
 .../reifier/language/XQueryExpressionReifier.java  |  63 +++++++
 .../loadbalancer/StickyLoadBalancerReifier.java    |   2 +-
 45 files changed, 767 insertions(+), 604 deletions(-)

diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/ExpressionSubElementDefinition.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/ExpressionSubElementDefinition.java
index 7db2521..3bb97af 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/ExpressionSubElementDefinition.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/ExpressionSubElementDefinition.java
@@ -20,12 +20,10 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.model.language.ExpressionDefinition;
-import org.apache.camel.spi.RouteContext;
 
 /**
  * Represents an expression sub element
@@ -35,20 +33,16 @@ import org.apache.camel.spi.RouteContext;
 public class ExpressionSubElementDefinition {
     @XmlElementRef
     private ExpressionDefinition expressionType;
-    @XmlTransient
-    private Expression expression;
-    @XmlTransient
-    private Predicate predicate;
 
     public ExpressionSubElementDefinition() {
     }
 
     public ExpressionSubElementDefinition(Expression expression) {
-        this.expression = expression;
+        this.expressionType = new ExpressionDefinition(expression);
     }
 
     public ExpressionSubElementDefinition(Predicate predicate) {
-        this.predicate = predicate;
+        this.expressionType = new ExpressionDefinition(predicate);
     }
 
     public ExpressionDefinition getExpressionType() {
@@ -59,46 +53,10 @@ public class ExpressionSubElementDefinition {
         this.expressionType = expressionType;
     }
 
-    public Expression getExpression() {
-        return expression;
-    }
-
-    public void setExpression(Expression expression) {
-        this.expression = expression;
-    }
-
-    public void setPredicate(Predicate predicate) {
-        this.predicate = predicate;
-    }
-
-    public Predicate getPredicate() {
-        return predicate;
-    }
-
-    public Expression createExpression(RouteContext routeContext) {
-        ExpressionDefinition expressionType = getExpressionType();
-        if (expressionType != null && expression == null) {
-            expression = expressionType.createExpression(routeContext);
-        }
-        return expression;
-    }
-
-    public Predicate createPredicate(RouteContext routeContext) {
-        ExpressionDefinition expressionType = getExpressionType();
-        if (expressionType != null && getPredicate() == null) {
-            setPredicate(expressionType.createPredicate(routeContext));
-        }
-        return getPredicate();
-    }
-
     @Override
     public String toString() {
-        if (expression != null) {
-            return expression.toString();
-        } else if (expressionType != null) {
+        if (expressionType != null) {
             return expressionType.toString();
-        } else if (predicate != null) {
-            return predicate.toString();
         }
         return super.toString();
     }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java
index 02b07ca..643a1cd 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java
@@ -451,15 +451,14 @@ public final class RouteDefinitionHelper {
     }
 
     private static void initRouteInput(CamelContext camelContext, 
FromDefinition input) {
-        // resolve property placeholders on route input which hasn't been done
-        // yet
-        if (input != null) {
-            try {
-                
ProcessorDefinitionHelper.resolvePropertyPlaceholders(camelContext, input);
-            } catch (Exception e) {
-                throw RuntimeCamelException.wrapRuntimeCamelException(e);
-            }
-        }
+//        // resolve property placeholders on route input which hasn't been 
done yet
+//        if (input != null) {
+//            try {
+//                
ProcessorDefinitionHelper.resolvePropertyPlaceholders(camelContext, input);
+//            } catch (Exception e) {
+//                throw RuntimeCamelException.wrapRuntimeCamelException(e);
+//            }
+//        }
     }
 
     private static void initParentAndErrorHandlerBuilder(CamelContext context, 
RouteDefinition route, List<ProcessorDefinition<?>> abstracts,
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java
index f273cc7..e6fb629 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java
@@ -28,24 +28,16 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.XmlValue;
-import javax.xml.namespace.QName;
 
-import org.apache.camel.AfterPropertiesConfigured;
 import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.ExpressionFactory;
-import org.apache.camel.ExtendedCamelContext;
-import org.apache.camel.NoSuchLanguageException;
 import org.apache.camel.Predicate;
 import org.apache.camel.model.DefinitionPropertyPlaceholderConfigurer;
 import org.apache.camel.model.OtherAttributesAware;
-import org.apache.camel.spi.Language;
+import org.apache.camel.reifier.language.ExpressionReifier;
 import org.apache.camel.spi.Metadata;
-import org.apache.camel.spi.RouteContext;
-import org.apache.camel.support.ExpressionToPredicateAdapter;
-import org.apache.camel.support.ScriptHelper;
 import org.apache.camel.util.CollectionStringBuffer;
 import org.apache.camel.util.ObjectHelper;
 
@@ -122,113 +114,10 @@ public class ExpressionDefinition implements Expression, 
Predicate, OtherAttribu
         return sb.toString();
     }
 
-    public Object evaluate(Exchange exchange) {
-        return evaluate(exchange, Object.class);
-    }
-
-    @Override
-    public <T> T evaluate(Exchange exchange, Class<T> type) {
-        if (expressionValue == null) {
-            expressionValue = createExpression(exchange.getContext());
-        }
-        ObjectHelper.notNull(expressionValue, "expressionValue");
-        return expressionValue.evaluate(exchange, type);
-    }
-
-    public void assertMatches(String text, Exchange exchange) throws 
AssertionError {
-        if (!matches(exchange)) {
-            throw new AssertionError(text + getExpression() + " for exchange: 
" + exchange);
-        }
-    }
-
-    @Override
-    public boolean matches(Exchange exchange) {
-        if (predicate == null) {
-            predicate = createPredicate(exchange.getContext());
-        }
-        ObjectHelper.notNull(predicate, "predicate");
-        return predicate.matches(exchange);
-    }
-
     public String getLanguage() {
         return "";
     }
 
-    public final Predicate createPredicate(RouteContext routeContext) {
-        return createPredicate(routeContext.getCamelContext());
-    }
-
-    public Predicate createPredicate(CamelContext camelContext) {
-        if (predicate == null) {
-            if (getExpressionType() != null) {
-                predicate = getExpressionType().createPredicate(camelContext);
-            } else if (getExpressionValue() != null) {
-                predicate = new 
ExpressionToPredicateAdapter(getExpressionValue());
-            } else if (getExpression() != null) {
-                ObjectHelper.notNull("language", getLanguage());
-                Language language = 
camelContext.resolveLanguage(getLanguage());
-                if (language == null) {
-                    throw new NoSuchLanguageException(getLanguage());
-                }
-                String exp = getExpression();
-                // should be true by default
-                boolean isTrim = getTrim() == null || 
Boolean.parseBoolean(getTrim());
-                // trim if configured to trim
-                if (exp != null && isTrim) {
-                    exp = exp.trim();
-                }
-                // resolve the expression as it may be an external script from
-                // the classpath/file etc
-                exp = ScriptHelper.resolveOptionalExternalScript(camelContext, 
exp);
-
-                predicate = language.createPredicate(exp);
-                configurePredicate(camelContext, predicate);
-            }
-        }
-        // inject CamelContext if its aware
-        if (predicate instanceof CamelContextAware) {
-            ((CamelContextAware)predicate).setCamelContext(camelContext);
-        }
-        return predicate;
-    }
-
-    public final Expression createExpression(RouteContext routeContext) {
-        return createExpression(routeContext.getCamelContext());
-    }
-
-    @Override
-    public Expression createExpression(CamelContext camelContext) {
-        if (getExpressionValue() == null) {
-            if (getExpressionType() != null) {
-                
setExpressionValue(getExpressionType().createExpression(camelContext));
-            } else if (getExpression() != null) {
-                ObjectHelper.notNull("language", getLanguage());
-                Language language = 
camelContext.resolveLanguage(getLanguage());
-                if (language == null) {
-                    throw new NoSuchLanguageException(getLanguage());
-                }
-                String exp = getExpression();
-                // should be true by default
-                boolean isTrim = getTrim() == null || 
Boolean.parseBoolean(getTrim());
-                // trim if configured to trim
-                if (exp != null && isTrim) {
-                    exp = exp.trim();
-                }
-                // resolve the expression as it may be an external script from
-                // the classpath/file etc
-                exp = ScriptHelper.resolveOptionalExternalScript(camelContext, 
exp);
-
-                setExpressionValue(language.createExpression(exp));
-                configureExpression(camelContext, getExpressionValue());
-            }
-        }
-        // inject CamelContext if its aware
-        if (getExpressionValue() instanceof CamelContextAware) {
-            
((CamelContextAware)getExpressionValue()).setCamelContext(camelContext);
-        }
-        return getExpressionValue();
-    }
-
     public String getExpression() {
         return expression;
     }
@@ -314,32 +203,39 @@ public class ExpressionDefinition implements Expression, 
Predicate, OtherAttribu
         this.expressionType = expressionType;
     }
 
-    protected void configurePredicate(CamelContext camelContext, Predicate 
predicate) {
-        // allows to perform additional logic after the properties has been
-        // configured which may be needed
-        // in the various camel components outside camel-core
-        if (predicate instanceof AfterPropertiesConfigured) {
-            
((AfterPropertiesConfigured)predicate).afterPropertiesConfigured(camelContext);
-        }
+    //
+    // ExpressionFactory
+    //
+
+    @Override
+    public Expression createExpression(CamelContext camelContext) {
+        return ExpressionReifier.reifier(camelContext, 
this).createExpression();
     }
 
-    protected void configureExpression(CamelContext camelContext, Expression 
expression) {
-        // allows to perform additional logic after the properties has been
-        // configured which may be needed
-        // in the various camel components outside camel-core
-        if (expression instanceof AfterPropertiesConfigured) {
-            
((AfterPropertiesConfigured)expression).afterPropertiesConfigured(camelContext);
+    //
+    // Expression
+    //
+
+    @Override
+    public <T> T evaluate(Exchange exchange, Class<T> type) {
+        if (expressionValue == null) {
+            expressionValue = createExpression(exchange.getContext());
         }
+        ObjectHelper.notNull(expressionValue, "expressionValue");
+        return expressionValue.evaluate(exchange, type);
     }
 
-    /**
-     * Sets a named property on the object instance using introspection
-     */
-    protected void setProperty(CamelContext camelContext, Object bean, String 
name, Object value) {
-        try {
-            
camelContext.adapt(ExtendedCamelContext.class).getBeanIntrospection().setProperty(camelContext,
 bean, name, value);
-        } catch (Exception e) {
-            throw new IllegalArgumentException("Failed to set property " + 
name + " on " + bean + ". Reason: " + e, e);
+    //
+    // Predicate
+    //
+
+    @Override
+    public boolean matches(Exchange exchange) {
+        if (predicate == null) {
+            predicate = ExpressionReifier.reifier(exchange.getContext(), 
this).createPredicate();
         }
+        ObjectHelper.notNull(predicate, "predicate");
+        return predicate.matches(exchange);
     }
+
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
index 1596961..75dd3d0 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
@@ -22,10 +22,6 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.Metadata;
 
 /**
@@ -145,62 +141,4 @@ public class JsonPathExpression extends 
ExpressionDefinition {
         return "jsonpath";
     }
 
-    @Override
-    public Expression createExpression(CamelContext camelContext) {
-        if (resultType == null && resultTypeName != null) {
-            try {
-                resultType = 
camelContext.getClassResolver().resolveMandatoryClass(resultTypeName);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeCamelException(e);
-            }
-        }
-        return super.createExpression(camelContext);
-    }
-
-    @Override
-    protected void configureExpression(CamelContext camelContext, Expression 
expression) {
-        if (resultType != null) {
-            setProperty(camelContext, expression, "resultType", resultType);
-        }
-        if (suppressExceptions != null) {
-            setProperty(camelContext, expression, "suppressExceptions", 
suppressExceptions);
-        }
-        if (allowSimple != null) {
-            setProperty(camelContext, expression, "allowSimple", allowSimple);
-        }
-        if (allowEasyPredicate != null) {
-            setProperty(camelContext, expression, "allowEasyPredicate", 
allowEasyPredicate);
-        }
-        if (writeAsString != null) {
-            setProperty(camelContext, expression, "writeAsString", 
writeAsString);
-        }
-        if (headerName != null) {
-            setProperty(camelContext, expression, "headerName", headerName);
-        }
-        super.configureExpression(camelContext, expression);
-    }
-
-    @Override
-    protected void configurePredicate(CamelContext camelContext, Predicate 
predicate) {
-        if (resultType != null) {
-            setProperty(camelContext, predicate, "resultType", resultType);
-        }
-        if (suppressExceptions != null) {
-            setProperty(camelContext, predicate, "suppressExceptions", 
suppressExceptions);
-        }
-        if (allowSimple != null) {
-            setProperty(camelContext, predicate, "allowSimple", allowSimple);
-        }
-        if (allowEasyPredicate != null) {
-            setProperty(camelContext, predicate, "allowEasyPredicate", 
allowEasyPredicate);
-        }
-        if (writeAsString != null) {
-            setProperty(camelContext, predicate, "writeAsString", 
writeAsString);
-        }
-        if (headerName != null) {
-            setProperty(camelContext, predicate, "headerName", headerName);
-        }
-        super.configurePredicate(camelContext, predicate);
-    }
-
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
index 587b24c..fc65cfd 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
@@ -22,12 +22,6 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
-import org.apache.camel.AfterPropertiesConfigured;
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.spi.Language;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.util.ObjectHelper;
 
@@ -151,48 +145,6 @@ public class MethodCallExpression extends 
ExpressionDefinition {
         }
     }
 
-    @Override
-    public Expression createExpression(CamelContext camelContext) {
-        if (beanType == null && beanTypeName != null) {
-            try {
-                beanType = 
camelContext.getClassResolver().resolveMandatoryClass(beanTypeName);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeCamelException(e);
-            }
-        }
-
-        // special for bean language where we need to configure it first
-        Language lan = camelContext.resolveLanguage("bean");
-        configureLanguage(camelContext, lan);
-        // .. and create expression with null value as we use the configured
-        // properties instead
-        Expression exp = lan.createExpression(null);
-        if (exp instanceof AfterPropertiesConfigured) {
-            
((AfterPropertiesConfigured)exp).afterPropertiesConfigured(camelContext);
-        }
-        return exp;
-    }
-
-    protected void configureLanguage(CamelContext camelContext, Language 
language) {
-        if (instance != null) {
-            setProperty(camelContext, language, "bean", instance);
-        }
-        if (beanType != null) {
-            setProperty(camelContext, language, "beanType", beanType);
-        }
-        if (ref != null) {
-            setProperty(camelContext, language, "ref", ref);
-        }
-        if (method != null) {
-            setProperty(camelContext, language, "method", method);
-        }
-    }
-
-    @Override
-    public Predicate createPredicate(CamelContext camelContext) {
-        return (Predicate)createExpression(camelContext);
-    }
-
     private String beanName() {
         if (ref != null) {
             return ref;
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
index 3411cb7..66c7d59 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
@@ -59,22 +59,4 @@ public abstract class NamespaceAwareExpression extends 
ExpressionDefinition impl
         this.namespaces = namespaces;
     }
 
-    @Override
-    protected void configureExpression(CamelContext camelContext, Expression 
expression) {
-        configureNamespaceAware(expression);
-        super.configureExpression(camelContext, expression);
-    }
-
-    @Override
-    protected void configurePredicate(CamelContext camelContext, Predicate 
predicate) {
-        configureNamespaceAware(predicate);
-        super.configurePredicate(camelContext, predicate);
-    }
-
-    protected void configureNamespaceAware(Object builder) {
-        if (namespaces != null && builder instanceof NamespaceAware) {
-            NamespaceAware namespaceAware = (NamespaceAware)builder;
-            namespaceAware.setNamespaces(namespaces);
-        }
-    }
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/SimpleExpression.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/SimpleExpression.java
index ba19330..5951d6f 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/SimpleExpression.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/SimpleExpression.java
@@ -22,11 +22,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.builder.SimpleBuilder;
 import org.apache.camel.spi.Metadata;
 
 /**
@@ -79,31 +75,4 @@ public class SimpleExpression extends ExpressionDefinition {
         this.resultTypeName = resultTypeName;
     }
 
-    @Override
-    public Expression createExpression(CamelContext camelContext) {
-        if (resultType == null && resultTypeName != null) {
-            try {
-                resultType = 
camelContext.getClassResolver().resolveMandatoryClass(resultTypeName);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeCamelException(e);
-            }
-        }
-
-        String exp = getExpression();
-        // should be true by default
-        boolean isTrim = getTrim() == null || Boolean.parseBoolean(getTrim());
-        if (exp != null && isTrim) {
-            exp = exp.trim();
-        }
-
-        SimpleBuilder answer = new SimpleBuilder(exp);
-        answer.setResultType(resultType);
-        return answer;
-    }
-
-    @Override
-    public Predicate createPredicate(CamelContext camelContext) {
-        // SimpleBuilder is also a Predicate
-        return (Predicate)createExpression(camelContext);
-    }
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
index 3883f05..bd9e4ed 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
@@ -21,12 +21,8 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
 import org.apache.camel.language.tokenizer.TokenizeLanguage;
 import org.apache.camel.spi.Metadata;
-import org.apache.camel.support.ExpressionToPredicateAdapter;
 
 /**
  * To use Camel message body or header with a tokenizer in Camel expressions or
@@ -198,45 +194,6 @@ public class TokenizerExpression extends 
ExpressionDefinition {
     }
 
     @Override
-    public Expression createExpression(CamelContext camelContext) {
-        // special for new line tokens, if defined from XML then its 2
-        // characters, so we replace that back to a single char
-        if (token.startsWith("\\n")) {
-            token = '\n' + token.substring(2);
-        }
-
-        TokenizeLanguage language = new TokenizeLanguage();
-        language.setToken(token);
-        language.setEndToken(endToken);
-        language.setInheritNamespaceTagName(inheritNamespaceTagName);
-        language.setHeaderName(headerName);
-        language.setGroupDelimiter(groupDelimiter);
-        if (regex != null) {
-            language.setRegex(Boolean.parseBoolean(regex));
-        }
-        if (xml != null) {
-            language.setXml(Boolean.parseBoolean(xml));
-        }
-        if (includeTokens != null) {
-            language.setIncludeTokens(Boolean.parseBoolean(includeTokens));
-        }
-        if (group != null && !"0".equals(group)) {
-            language.setGroup(group);
-        }
-
-        if (skipFirst != null) {
-            language.setSkipFirst(Boolean.parseBoolean(skipFirst));
-        }
-        return language.createExpression();
-    }
-
-    @Override
-    public Predicate createPredicate(CamelContext camelContext) {
-        Expression exp = createExpression(camelContext);
-        return ExpressionToPredicateAdapter.toPredicate(exp);
-    }
-
-    @Override
     public String toString() {
         if (endToken != null) {
             return "tokenize{body() using tokens: " + token + "..." + endToken 
+ "}";
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java
index 93a5997..d206a4e 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.model.language;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
@@ -96,32 +99,4 @@ public class XMLTokenizerExpression extends 
NamespaceAwareExpression {
         this.group = group;
     }
 
-    @Override
-    protected void configureExpression(CamelContext camelContext, Expression 
expression) {
-        if (headerName != null) {
-            setProperty(camelContext, expression, "headerName", headerName);
-        }
-        if (mode != null) {
-            setProperty(camelContext, expression, "mode", mode);
-        }
-        if (group != null) {
-            setProperty(camelContext, expression, "group", group);
-        }
-        super.configureExpression(camelContext, expression);
-    }
-
-    @Override
-    protected void configurePredicate(CamelContext camelContext, Predicate 
predicate) {
-        if (headerName != null) {
-            setProperty(camelContext, predicate, "headerName", headerName);
-        }
-        if (mode != null) {
-            setProperty(camelContext, predicate, "mode", mode);
-        }
-        if (group != null) {
-            setProperty(camelContext, predicate, "group", group);
-        }
-        super.configurePredicate(camelContext, predicate);
-    }
-
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XPathExpression.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XPathExpression.java
index 4cad7f6..8acd6da 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XPathExpression.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XPathExpression.java
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.model.language;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
@@ -190,6 +193,14 @@ public class XPathExpression extends 
NamespaceAwareExpression {
         this.headerName = headerName;
     }
 
+    public XPathFactory getXPathFactory() {
+        return xpathFactory;
+    }
+
+    public void setXPathFactory(XPathFactory xpathFactory) {
+        this.xpathFactory = xpathFactory;
+    }
+
     public String getThreadSafety() {
         return threadSafety;
     }
@@ -210,107 +221,6 @@ public class XPathExpression extends 
NamespaceAwareExpression {
         this.threadSafety = threadSafety;
     }
 
-    @Override
-    public Expression createExpression(CamelContext camelContext) {
-        if (documentType == null && documentTypeName != null) {
-            try {
-                documentType = 
camelContext.getClassResolver().resolveMandatoryClass(documentTypeName);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeCamelException(e);
-            }
-        }
-        if (resultType == null && resultTypeName != null) {
-            try {
-                resultType = 
camelContext.getClassResolver().resolveMandatoryClass(resultTypeName);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeCamelException(e);
-            }
-        }
-        resolveXPathFactory(camelContext);
-        return super.createExpression(camelContext);
-    }
-
-    @Override
-    public Predicate createPredicate(CamelContext camelContext) {
-        if (documentType == null && documentTypeName != null) {
-            try {
-                documentType = 
camelContext.getClassResolver().resolveMandatoryClass(documentTypeName);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeCamelException(e);
-            }
-        }
-        resolveXPathFactory(camelContext);
-        return super.createPredicate(camelContext);
-    }
-
-    @Override
-    protected void configureExpression(CamelContext camelContext, Expression 
expression) {
-        boolean isSaxon = getSaxon() != null && 
Boolean.parseBoolean(getSaxon());
-        boolean isLogNamespaces = getLogNamespaces() != null && 
Boolean.parseBoolean(getLogNamespaces());
-
-        if (documentType != null) {
-            setProperty(camelContext, expression, "documentType", 
documentType);
-        }
-        if (resultType != null) {
-            setProperty(camelContext, expression, "resultType", resultType);
-        }
-        if (isSaxon) {
-            setProperty(camelContext, expression, "useSaxon", true);
-        }
-        if (xpathFactory != null) {
-            setProperty(camelContext, expression, "xPathFactory", 
xpathFactory);
-        }
-        if (objectModel != null) {
-            setProperty(camelContext, expression, "objectModelUri", 
objectModel);
-        }
-        if (threadSafety != null) {
-            setProperty(camelContext, expression, "threadSafety", 
threadSafety);
-        }
-        if (isLogNamespaces) {
-            setProperty(camelContext, expression, "logNamespaces", true);
-        }
-        if (ObjectHelper.isNotEmpty(getHeaderName())) {
-            setProperty(camelContext, expression, "headerName", 
getHeaderName());
-        }
-        // moved the super configuration to the bottom so that the namespace
-        // init picks up the newly set XPath Factory
-        super.configureExpression(camelContext, expression);
-    }
-
-    @Override
-    protected void configurePredicate(CamelContext camelContext, Predicate 
predicate) {
-        boolean isSaxon = getSaxon() != null && 
Boolean.parseBoolean(getSaxon());
-        boolean isLogNamespaces = getLogNamespaces() != null && 
Boolean.parseBoolean(getLogNamespaces());
-
-        if (documentType != null) {
-            setProperty(camelContext, predicate, "documentType", documentType);
-        }
-        if (resultType != null) {
-            setProperty(camelContext, predicate, "resultType", resultType);
-        }
-        if (isSaxon) {
-            setProperty(camelContext, predicate, "useSaxon", true);
-        }
-        if (xpathFactory != null) {
-            setProperty(camelContext, predicate, "xPathFactory", xpathFactory);
-        }
-        if (objectModel != null) {
-            setProperty(camelContext, predicate, "objectModelUri", 
objectModel);
-        }
-        if (threadSafety != null) {
-            setProperty(camelContext, predicate, "threadSafety", threadSafety);
-        }
-        if (isLogNamespaces) {
-            setProperty(camelContext, predicate, "logNamespaces", true);
-        }
-        if (ObjectHelper.isNotEmpty(getHeaderName())) {
-            setProperty(camelContext, predicate, "headerName", 
getHeaderName());
-        }
-        // moved the super configuration to the bottom so that the namespace
-        // init picks up the newly set XPath Factory
-        super.configurePredicate(camelContext, predicate);
-    }
-
     private void resolveXPathFactory(CamelContext camelContext) {
         // Factory and Object Model can be set simultaneously. The underlying
         // XPathBuilder allows for setting Saxon too, as it is simply a 
shortcut
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XQueryExpression.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XQueryExpression.java
index c84679e..eaa9e27 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XQueryExpression.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/model/language/XQueryExpression.java
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.model.language;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
@@ -25,9 +28,7 @@ import javax.xml.bind.annotation.XmlTransient;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.Metadata;
-import org.apache.camel.util.ObjectHelper;
 
 /**
  * To use XQuery (XML) in Camel expressions or predicates.
@@ -92,39 +93,4 @@ public class XQueryExpression extends 
NamespaceAwareExpression {
         this.headerName = headerName;
     }
 
-    @Override
-    public Expression createExpression(CamelContext camelContext) {
-        if (resultType == null && type != null) {
-            try {
-                resultType = 
camelContext.getClassResolver().resolveMandatoryClass(type);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeCamelException(e);
-            }
-        }
-
-        return super.createExpression(camelContext);
-    }
-
-    @Override
-    protected void configureExpression(CamelContext camelContext, Expression 
expression) {
-        if (resultType != null) {
-            setProperty(camelContext, expression, "resultType", resultType);
-        }
-        if (ObjectHelper.isNotEmpty(getHeaderName())) {
-            setProperty(camelContext, expression, "headerName", 
getHeaderName());
-        }
-        super.configureExpression(camelContext, expression);
-    }
-
-    @Override
-    protected void configurePredicate(CamelContext camelContext, Predicate 
predicate) {
-        if (resultType != null) {
-            setProperty(camelContext, predicate, "resultType", resultType);
-        }
-        if (ObjectHelper.isNotEmpty(getHeaderName())) {
-            setProperty(camelContext, predicate, "headerName", 
getHeaderName());
-        }
-        super.configurePredicate(camelContext, predicate);
-    }
-
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AbstractReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AbstractReifier.java
index cefcfab..17eac69 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AbstractReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AbstractReifier.java
@@ -17,6 +17,11 @@
 package org.apache.camel.reifier;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.model.ExpressionSubElementDefinition;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.reifier.language.ExpressionReifier;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.support.CamelContextHelper;
 
@@ -56,4 +61,20 @@ public abstract class AbstractReifier {
         return CamelContextHelper.parse(camelContext, clazz, text);
     }
 
+    protected Expression createExpression(ExpressionDefinition expression) {
+        return ExpressionReifier.reifier(camelContext, 
expression).createExpression();
+    }
+
+    protected Expression createExpression(ExpressionSubElementDefinition 
expression) {
+        return ExpressionReifier.reifier(camelContext, 
expression).createExpression();
+    }
+
+    protected Predicate createPredicate(ExpressionDefinition expression) {
+        return ExpressionReifier.reifier(camelContext, 
expression).createPredicate();
+    }
+
+    protected Predicate createPredicate(ExpressionSubElementDefinition 
expression) {
+        return ExpressionReifier.reifier(camelContext, 
expression).createPredicate();
+    }
+
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AggregateReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AggregateReifier.java
index 81f129f..ce82896 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AggregateReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/AggregateReifier.java
@@ -54,7 +54,7 @@ public class AggregateReifier extends 
ProcessorReifier<AggregateDefinition> {
         CamelInternalProcessor internal = new 
CamelInternalProcessor(camelContext, childProcessor);
         internal.addAdvice(new 
CamelInternalProcessor.UnitOfWorkProcessorAdvice(routeContext, camelContext));
 
-        Expression correlation = 
definition.getExpression().createExpression(routeContext);
+        Expression correlation = createExpression(definition.getExpression());
         AggregationStrategy strategy = createAggregationStrategy(routeContext);
 
         boolean parallel = parseBoolean(definition.getParallelProcessing());
@@ -112,7 +112,7 @@ public class AggregateReifier extends 
ProcessorReifier<AggregateDefinition> {
             
answer.setOptimisticLocking(parseBoolean(definition.getOptimisticLocking()));
         }
         if (definition.getCompletionPredicate() != null) {
-            Predicate predicate = 
definition.getCompletionPredicate().createPredicate(routeContext);
+            Predicate predicate = 
createPredicate(definition.getCompletionPredicate());
             answer.setCompletionPredicate(predicate);
         } else if (strategy instanceof Predicate) {
             // if aggregation strategy implements predicate and was not
@@ -121,7 +121,7 @@ public class AggregateReifier extends 
ProcessorReifier<AggregateDefinition> {
             answer.setCompletionPredicate((Predicate)strategy);
         }
         if (definition.getCompletionTimeoutExpression() != null) {
-            Expression expression = 
definition.getCompletionTimeoutExpression().createExpression(routeContext);
+            Expression expression = 
createExpression(definition.getCompletionTimeoutExpression());
             answer.setCompletionTimeoutExpression(expression);
         }
         if (definition.getCompletionTimeout() != null) {
@@ -131,7 +131,7 @@ public class AggregateReifier extends 
ProcessorReifier<AggregateDefinition> {
             
answer.setCompletionInterval(parseLong(definition.getCompletionInterval()));
         }
         if (definition.getCompletionSizeExpression() != null) {
-            Expression expression = 
definition.getCompletionSizeExpression().createExpression(routeContext);
+            Expression expression = 
createExpression(definition.getCompletionSizeExpression());
             answer.setCompletionSizeExpression(expression);
         }
         if (definition.getCompletionSize() != null) {
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/CatchReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/CatchReifier.java
index f8a9ae5..82fbeb9 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/CatchReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/CatchReifier.java
@@ -56,7 +56,7 @@ public class CatchReifier extends 
ProcessorReifier<CatchDefinition> {
 
         Predicate when = null;
         if (definition.getOnWhen() != null) {
-            when = 
definition.getOnWhen().getExpression().createPredicate(routeContext);
+            when = createPredicate(definition.getOnWhen().getExpression());
         }
 
         return new CatchProcessor(definition.getExceptionClasses(), 
childProcessor, when, null);
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DelayReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DelayReifier.java
index 8109f5b..9c8a984 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DelayReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DelayReifier.java
@@ -22,7 +22,6 @@ import org.apache.camel.Expression;
 import org.apache.camel.Processor;
 import org.apache.camel.model.DelayDefinition;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.processor.Delayer;
 import org.apache.camel.spi.RouteContext;
 
@@ -49,11 +48,7 @@ public class DelayReifier extends 
ExpressionReifier<DelayDefinition> {
     }
 
     private Expression createAbsoluteTimeDelayExpression() {
-        ExpressionDefinition expr = definition.getExpression();
-        if (expr != null) {
-            return expr.createExpression(routeContext);
-        }
-        return null;
+        return definition.getExpression() != null ? 
createExpression(definition.getExpression()) : null;
     }
 
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DynamicRouterReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DynamicRouterReifier.java
index 0acf744..015d6be 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DynamicRouterReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/DynamicRouterReifier.java
@@ -34,7 +34,7 @@ public class DynamicRouterReifier extends 
ExpressionReifier<DynamicRouterDefinit
 
     @Override
     public Processor createProcessor() throws Exception {
-        Expression expression = 
definition.getExpression().createExpression(routeContext);
+        Expression expression = createExpression(definition.getExpression());
         String delimiter = definition.getUriDelimiter() != null ? 
definition.getUriDelimiter() : DynamicRouterDefinition.DEFAULT_DELIMITER;
 
         DynamicRouter dynamicRouter = new DynamicRouter(camelContext, 
expression, delimiter);
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/EnrichReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/EnrichReifier.java
index 2263a8f..09e8dfa 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/EnrichReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/EnrichReifier.java
@@ -34,7 +34,7 @@ public class EnrichReifier extends 
ExpressionReifier<EnrichDefinition> {
 
     @Override
     public Processor createProcessor() throws Exception {
-        Expression exp = 
definition.getExpression().createExpression(routeContext);
+        Expression exp = createExpression(definition.getExpression());
         boolean isShareUnitOfWork = definition.getShareUnitOfWork() != null && 
Boolean.parseBoolean(definition.getShareUnitOfWork());
         boolean isIgnoreInvalidEndpoint = 
definition.getIgnoreInvalidEndpoint() != null && 
Boolean.parseBoolean(definition.getIgnoreInvalidEndpoint());
 
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ExpressionReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ExpressionReifier.java
index 30772b6..548c0e8 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ExpressionReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ExpressionReifier.java
@@ -45,7 +45,7 @@ abstract class ExpressionReifier<T extends ExpressionNode> 
extends ProcessorReif
      * @return the created predicate
      */
     protected Predicate createPredicate() {
-        return definition.getExpression().createPredicate(routeContext);
+        return createPredicate(definition.getExpression());
     }
 
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/IdempotentConsumerReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/IdempotentConsumerReifier.java
index 6651036..7c5ae5c 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/IdempotentConsumerReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/IdempotentConsumerReifier.java
@@ -38,7 +38,7 @@ public class IdempotentConsumerReifier extends 
ExpressionReifier<IdempotentConsu
         IdempotentRepository idempotentRepository = 
resolveMessageIdRepository(routeContext);
         ObjectHelper.notNull(idempotentRepository, "idempotentRepository", 
definition);
 
-        Expression expression = 
definition.getExpression().createExpression(routeContext);
+        Expression expression = createExpression(definition.getExpression());
 
         // these boolean should be true by default
         boolean eager = definition.getEager() == null || 
Boolean.parseBoolean(definition.getEager());
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/LoopReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/LoopReifier.java
index 477d4be..ec5a8bc 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/LoopReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/LoopReifier.java
@@ -39,9 +39,9 @@ public class LoopReifier extends 
ExpressionReifier<LoopDefinition> {
         Predicate predicate = null;
         Expression expression = null;
         if (isWhile) {
-            predicate = 
definition.getExpression().createPredicate(routeContext);
+            predicate = createPredicate(definition.getExpression());
         } else {
-            expression = 
definition.getExpression().createExpression(routeContext);
+            expression = createExpression(definition.getExpression());
         }
         return new LoopProcessor(camelContext, output, expression, predicate, 
isCopy);
     }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java
index eb47895..19066fe 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java
@@ -72,7 +72,7 @@ public class OnCompletionReifier extends 
ProcessorReifier<OnCompletionDefinition
 
         Predicate when = null;
         if (definition.getOnWhen() != null) {
-            when = 
definition.getOnWhen().getExpression().createPredicate(routeContext);
+            when = createPredicate(definition.getOnWhen().getExpression());
         }
 
         boolean shutdownThreadPool = willCreateNewThreadPool(definition, 
isParallelProcessing);
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java
index 5f94c72..8f63f08 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java
@@ -100,12 +100,12 @@ public class OnExceptionReifier extends 
ProcessorReifier<OnExceptionDefinition>
 
         Predicate when = null;
         if (definition.getOnWhen() != null) {
-            when = 
definition.getOnWhen().getExpression().createPredicate(routeContext);
+            when = createPredicate(definition.getOnWhen().getExpression());
         }
 
         Predicate handle = null;
         if (definition.getHandled() != null) {
-            handle = definition.getHandled().createPredicate(routeContext);
+            handle = createPredicate(definition.getHandled());
         }
 
         return new CatchProcessor(classes, childProcessor, when, handle);
@@ -122,20 +122,23 @@ public class OnExceptionReifier extends 
ProcessorReifier<OnExceptionDefinition>
     }
 
     private void setHandledFromExpressionType() {
-        if (definition.getHandled() != null && definition.getHandledPolicy() 
== null && routeContext != null) {
-            
definition.handled(definition.getHandled().createPredicate(routeContext));
+        // TODO: should not modify
+        if (definition.getHandled() != null && definition.getHandledPolicy() 
== null && camelContext != null) {
+            definition.handled(createPredicate(definition.getHandled()));
         }
     }
 
     private void setContinuedFromExpressionType() {
-        if (definition.getContinued() != null && 
definition.getContinuedPolicy() == null && routeContext != null) {
-            
definition.continued(definition.getContinued().createPredicate(routeContext));
+        // TODO: should not modify
+        if (definition.getContinued() != null && 
definition.getContinuedPolicy() == null && camelContext != null) {
+            definition.continued(createPredicate(definition.getContinued()));
         }
     }
 
     private void setRetryWhileFromExpressionType() {
-        if (definition.getRetryWhile() != null && 
definition.getRetryWhilePolicy() == null && routeContext != null) {
-            
definition.retryWhile(definition.getRetryWhile().createPredicate(routeContext));
+        // TODO: should not modify
+        if (definition.getRetryWhile() != null && 
definition.getRetryWhilePolicy() == null && camelContext != null) {
+            definition.retryWhile(createPredicate(definition.getRetryWhile()));
         }
     }
 
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/PollEnrichReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/PollEnrichReifier.java
index 05d8555..b13d4c3 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/PollEnrichReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/PollEnrichReifier.java
@@ -38,7 +38,7 @@ public class PollEnrichReifier extends 
ProcessorReifier<PollEnrichDefinition> {
         // if no timeout then we should block, and there use a negative timeout
         long time = definition.getTimeout() != null ? 
parseLong(definition.getTimeout()) : -1;
         boolean isIgnoreInvalidEndpoint = 
definition.getIgnoreInvalidEndpoint() != null && 
parseBoolean(definition.getIgnoreInvalidEndpoint());
-        Expression exp = 
definition.getExpression().createExpression(routeContext);
+        Expression exp = createExpression(definition.getExpression());
 
         PollEnricher enricher = new PollEnricher(exp, time);
 
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RecipientListReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RecipientListReifier.java
index 68cc91c..7ad3b7f 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RecipientListReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RecipientListReifier.java
@@ -43,7 +43,7 @@ public class RecipientListReifier extends 
ProcessorReifier<RecipientListDefiniti
 
     @Override
     public Processor createProcessor() throws Exception {
-        final Expression expression = 
definition.getExpression().createExpression(routeContext);
+        final Expression expression = 
createExpression(definition.getExpression());
 
         boolean isParallelProcessing = definition.getParallelProcessing() != 
null && parseBoolean(definition.getParallelProcessing());
         boolean isStreaming = definition.getStreaming() != null && 
parseBoolean(definition.getStreaming());
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ResequenceReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ResequenceReifier.java
index ca70fb1..5168421 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ResequenceReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ResequenceReifier.java
@@ -72,7 +72,7 @@ public class ResequenceReifier extends 
ProcessorReifier<ResequenceDefinition> {
     @SuppressWarnings("deprecation")
     protected Resequencer createBatchResequencer(RouteContext routeContext, 
BatchResequencerConfig config) throws Exception {
         Processor processor = this.createChildProcessor(true);
-        Expression expression = 
definition.getExpression().createExpression(routeContext);
+        Expression expression = createExpression(definition.getExpression());
 
         // and wrap in unit of work
         CamelInternalProcessor internal = new 
CamelInternalProcessor(camelContext, processor);
@@ -106,7 +106,7 @@ public class ResequenceReifier extends 
ProcessorReifier<ResequenceDefinition> {
      */
     protected StreamResequencer createStreamResequencer(RouteContext 
routeContext, StreamResequencerConfig config) throws Exception {
         Processor processor = this.createChildProcessor(true);
-        Expression expression = 
definition.getExpression().createExpression(routeContext);
+        Expression expression = createExpression(definition.getExpression());
 
         CamelInternalProcessor internal = new 
CamelInternalProcessor(camelContext, processor);
         internal.addAdvice(new 
CamelInternalProcessor.UnitOfWorkProcessorAdvice(routeContext, camelContext));
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RoutingSlipReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RoutingSlipReifier.java
index d1b5659..d5a39e0 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RoutingSlipReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RoutingSlipReifier.java
@@ -36,7 +36,7 @@ public class RoutingSlipReifier extends 
ExpressionReifier<RoutingSlipDefinition<
 
     @Override
     public Processor createProcessor() throws Exception {
-        Expression expression = 
definition.getExpression().createExpression(routeContext);
+        Expression expression = createExpression(definition.getExpression());
         String delimiter = definition.getUriDelimiter() != null ? 
definition.getUriDelimiter() : DEFAULT_DELIMITER;
 
         RoutingSlip routingSlip = new RoutingSlip(camelContext, expression, 
delimiter);
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ScriptReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ScriptReifier.java
index 36ad49f..e7f6568 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ScriptReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ScriptReifier.java
@@ -31,7 +31,7 @@ public class ScriptReifier extends 
ExpressionReifier<ScriptDefinition> {
 
     @Override
     public Processor createProcessor() throws Exception {
-        Expression expr = 
definition.getExpression().createExpression(routeContext);
+        Expression expr = createExpression(definition.getExpression());
         return new ScriptProcessor(expr);
     }
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetBodyReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetBodyReifier.java
index 2490e02..840bc37 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetBodyReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetBodyReifier.java
@@ -31,7 +31,7 @@ public class SetBodyReifier extends 
ExpressionReifier<SetBodyDefinition> {
 
     @Override
     public Processor createProcessor() throws Exception {
-        Expression expr = 
definition.getExpression().createExpression(routeContext);
+        Expression expr = createExpression(definition.getExpression());
         return new SetBodyProcessor(expr);
     }
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetHeaderReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetHeaderReifier.java
index bc26948..4214c73 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetHeaderReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetHeaderReifier.java
@@ -34,7 +34,7 @@ public class SetHeaderReifier extends 
ExpressionReifier<SetHeaderDefinition> {
     @Override
     public Processor createProcessor() throws Exception {
         ObjectHelper.notNull(definition.getName(), "headerName");
-        Expression expr = 
definition.getExpression().createExpression(routeContext);
+        Expression expr = createExpression(definition.getExpression());
         Expression nameExpr = 
ExpressionBuilder.parseSimpleOrFallbackToConstantExpression(definition.getName(),
 camelContext);
         return new SetHeaderProcessor(nameExpr, expr);
     }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetPropertyReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetPropertyReifier.java
index dd779bc..42da14b 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetPropertyReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SetPropertyReifier.java
@@ -34,7 +34,7 @@ public class SetPropertyReifier extends 
ExpressionReifier<SetPropertyDefinition>
     @Override
     public Processor createProcessor() throws Exception {
         ObjectHelper.notNull(definition.getName(), "propertyName", this);
-        Expression expr = 
definition.getExpression().createExpression(routeContext);
+        Expression expr = createExpression(definition.getExpression());
         Expression nameExpr = 
ExpressionBuilder.parseSimpleOrFallbackToConstantExpression(definition.getName(),
 camelContext);
         return new SetPropertyProcessor(nameExpr, expr);
     }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SortReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SortReifier.java
index c7e30dd..dfbf103 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SortReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SortReifier.java
@@ -57,7 +57,7 @@ public class SortReifier<T, U extends SortDefinition<T>> 
extends ExpressionReifi
         if (definition.getExpression() == null) {
             exp = bodyExpression();
         } else {
-            exp = definition.getExpression().createExpression(routeContext);
+            exp = createExpression(definition.getExpression());
         }
         return new SortProcessor<T>(exp, definition.getComparator());
     }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SplitReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SplitReifier.java
index d678766..d532049 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SplitReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/SplitReifier.java
@@ -57,7 +57,7 @@ public class SplitReifier extends 
ExpressionReifier<SplitDefinition> {
             
definition.setOnPrepare(CamelContextHelper.mandatoryLookup(camelContext, 
definition.getOnPrepareRef(), Processor.class));
         }
 
-        Expression exp = 
definition.getExpression().createExpression(routeContext);
+        Expression exp = createExpression(definition.getExpression());
 
         Splitter answer = new Splitter(camelContext, exp, childProcessor, 
definition.getAggregationStrategy(), isParallelProcessing, threadPool,
                                        shutdownThreadPool, isStreaming, 
definition.isStopOnException(), timeout, definition.getOnPrepare(), 
isShareUnitOfWork, isParallelAggregate,
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ThrottleReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ThrottleReifier.java
index 7c69045..356772a 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ThrottleReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ThrottleReifier.java
@@ -22,7 +22,6 @@ import org.apache.camel.Expression;
 import org.apache.camel.Processor;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.ThrottleDefinition;
-import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.processor.Throttler;
 import org.apache.camel.spi.RouteContext;
 
@@ -42,14 +41,14 @@ public class ThrottleReifier extends 
ExpressionReifier<ThrottleDefinition> {
         long period = definition.getTimePeriodMillis() != null ? 
definition.getTimePeriodMillis() : 1000L;
 
         // max requests per period is mandatory
-        Expression maxRequestsExpression = 
createMaxRequestsPerPeriodExpression(routeContext);
+        Expression maxRequestsExpression = 
createMaxRequestsPerPeriodExpression();
         if (maxRequestsExpression == null) {
             throw new IllegalArgumentException("MaxRequestsPerPeriod 
expression must be provided on " + this);
         }
 
         Expression correlation = null;
         if (definition.getCorrelationExpression() != null) {
-            correlation = 
definition.getCorrelationExpression().createExpression(routeContext);
+            correlation = 
createExpression(definition.getCorrelationExpression());
         }
 
         boolean reject = definition.getRejectExecution() != null && 
definition.getRejectExecution();
@@ -67,11 +66,7 @@ public class ThrottleReifier extends 
ExpressionReifier<ThrottleDefinition> {
     }
 
     private Expression createMaxRequestsPerPeriodExpression() {
-        ExpressionDefinition expr = definition.getExpression();
-        if (expr != null) {
-            return expr.createExpression(routeContext);
-        }
-        return null;
+        return definition.getExpression() != null ? 
createExpression(definition.getExpression()) : null;
     }
 
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/TransformReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/TransformReifier.java
index bc0de91..0532fc0 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/TransformReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/TransformReifier.java
@@ -31,7 +31,7 @@ public class TransformReifier extends 
ExpressionReifier<TransformDefinition> {
 
     @Override
     public Processor createProcessor() throws Exception {
-        Expression expr = 
definition.getExpression().createExpression(routeContext);
+        Expression expr = createExpression(definition.getExpression());
         return new TransformProcessor(expr);
     }
 }
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ValidateReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ValidateReifier.java
index f6ab5fc..30fbeb3 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ValidateReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/ValidateReifier.java
@@ -31,7 +31,7 @@ public class ValidateReifier extends 
ExpressionReifier<ValidateDefinition> {
 
     @Override
     public Processor createProcessor() throws Exception {
-        Predicate pred = 
definition.getExpression().createPredicate(routeContext);
+        Predicate pred = createPredicate(definition.getExpression());
         return new PredicateValidatingProcessor(pred);
     }
 
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/WireTapReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/WireTapReifier.java
index b720c1a..e10bb92 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/WireTapReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/WireTapReifier.java
@@ -71,7 +71,7 @@ public class WireTapReifier extends 
ToDynamicReifier<WireTapDefinition<?>> {
             
answer.addNewExchangeProcessor(definition.getNewExchangeProcessor());
         }
         if (definition.getNewExchangeExpression() != null) {
-            
answer.setNewExchangeExpression(definition.getNewExchangeExpression().createExpression(routeContext));
+            
answer.setNewExchangeExpression(createExpression(definition.getNewExchangeExpression()));
         }
         if (definition.getHeaders() != null && 
!definition.getHeaders().isEmpty()) {
             for (SetHeaderDefinition header : definition.getHeaders()) {
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java
new file mode 100644
index 0000000..3c905a2
--- /dev/null
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java
@@ -0,0 +1,200 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.reifier.language;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.function.BiFunction;
+
+import org.apache.camel.AfterPropertiesConfigured;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.Expression;
+import org.apache.camel.NoSuchLanguageException;
+import org.apache.camel.Predicate;
+import org.apache.camel.model.ExpressionSubElementDefinition;
+import org.apache.camel.model.language.ConstantExpression;
+import org.apache.camel.model.language.ExchangePropertyExpression;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.GroovyExpression;
+import org.apache.camel.model.language.HeaderExpression;
+import org.apache.camel.model.language.Hl7TerserExpression;
+import org.apache.camel.model.language.JsonPathExpression;
+import org.apache.camel.model.language.LanguageExpression;
+import org.apache.camel.model.language.MethodCallExpression;
+import org.apache.camel.model.language.MvelExpression;
+import org.apache.camel.model.language.OgnlExpression;
+import org.apache.camel.model.language.RefExpression;
+import org.apache.camel.model.language.SimpleExpression;
+import org.apache.camel.model.language.SpELExpression;
+import org.apache.camel.model.language.TokenizerExpression;
+import org.apache.camel.model.language.XMLTokenizerExpression;
+import org.apache.camel.model.language.XPathExpression;
+import org.apache.camel.model.language.XQueryExpression;
+import org.apache.camel.reifier.AbstractReifier;
+import org.apache.camel.spi.Language;
+import org.apache.camel.support.CamelContextHelper;
+import org.apache.camel.support.ExpressionToPredicateAdapter;
+import org.apache.camel.support.PropertyBindingSupport;
+import org.apache.camel.support.ScriptHelper;
+import org.apache.camel.util.ObjectHelper;
+
+public class ExpressionReifier<T extends ExpressionDefinition> extends 
AbstractReifier {
+
+    private static final Map<Class<?>, BiFunction<CamelContext, 
ExpressionDefinition, ExpressionReifier<? extends ExpressionDefinition>>> 
EXPRESSIONS;
+
+    static {
+        Map<Class<?>, BiFunction<CamelContext, ExpressionDefinition, 
ExpressionReifier<? extends ExpressionDefinition>>> map = new LinkedHashMap<>();
+        map.put(ConstantExpression.class, ExpressionReifier::new);
+        map.put(ExchangePropertyExpression.class, ExpressionReifier::new);
+        map.put(ExpressionDefinition.class, ExpressionReifier::new);
+        map.put(GroovyExpression.class, ExpressionReifier::new);
+        map.put(HeaderExpression.class, ExpressionReifier::new);
+        map.put(Hl7TerserExpression.class, ExpressionReifier::new);
+        map.put(JsonPathExpression.class, JsonPathExpressionReifier::new);
+        map.put(LanguageExpression.class, ExpressionReifier::new);
+        map.put(MethodCallExpression.class, MethodCallExpressionReifier::new);
+        map.put(MvelExpression.class, ExpressionReifier::new);
+        map.put(OgnlExpression.class, ExpressionReifier::new);
+        map.put(RefExpression.class, ExpressionReifier::new);
+        map.put(SimpleExpression.class, SimpleExpressionReifier::new);
+        map.put(SpELExpression.class, ExpressionReifier::new);
+        map.put(TokenizerExpression.class, TokenizerExpressionReifier::new);
+        map.put(XMLTokenizerExpression.class, 
XMLTokenizerExpressionReifier::new);
+        map.put(XPathExpression.class, XPathExpressionReifier::new);
+        map.put(XQueryExpression.class, XQueryExpressionReifier::new);
+        EXPRESSIONS = map;
+    }
+
+    protected final T definition;
+
+    public ExpressionReifier(CamelContext camelContext, T definition) {
+        super(camelContext);
+        this.definition = definition;
+    }
+
+    public static ExpressionReifier<? extends ExpressionDefinition> 
reifier(CamelContext camelContext, ExpressionSubElementDefinition definition) {
+        return reifier(camelContext, definition.getExpressionType());
+    }
+
+    public static ExpressionReifier<? extends ExpressionDefinition> 
reifier(CamelContext camelContext, ExpressionDefinition definition) {
+        BiFunction<CamelContext, ExpressionDefinition, ExpressionReifier<? 
extends ExpressionDefinition>> reifier = EXPRESSIONS.get(definition.getClass());
+        if (reifier != null) {
+            return reifier.apply(camelContext, definition);
+        }
+        throw new IllegalStateException("Unsupported definition: " + 
definition);
+    }
+
+    public Expression createExpression() {
+        Expression expression = definition.getExpressionValue();
+        if (expression == null) {
+            if (definition.getExpressionType() != null) {
+                expression = reifier(camelContext, 
definition.getExpressionType()).createExpression();
+            } else if (definition.getExpression() != null) {
+                ObjectHelper.notNull("language", definition.getLanguage());
+                Language language = 
camelContext.resolveLanguage(definition.getLanguage());
+                if (language == null) {
+                    throw new 
NoSuchLanguageException(definition.getLanguage());
+                }
+                String exp = CamelContextHelper.parseText(camelContext, 
definition.getExpression());
+                // should be true by default
+                boolean isTrim = definition.getTrim() == null || 
CamelContextHelper.parseBoolean(camelContext, definition.getTrim());
+                // trim if configured to trim
+                if (exp != null && isTrim) {
+                    exp = exp.trim();
+                }
+                // resolve the expression as it may be an external script from
+                // the classpath/file etc
+                exp = ScriptHelper.resolveOptionalExternalScript(camelContext, 
exp);
+                expression = language.createExpression(exp);
+                configureExpression(expression);
+            }
+        }
+        // inject CamelContext if its aware
+        if (expression instanceof CamelContextAware) {
+            ((CamelContextAware) expression).setCamelContext(camelContext);
+        }
+        return expression;
+    }
+
+    public Predicate createPredicate() {
+        Predicate predicate = definition.getPredicate();
+        if (predicate == null) {
+            if (definition.getExpressionType() != null) {
+                predicate = reifier(camelContext, 
definition.getExpressionType()).createPredicate();
+            } else if (definition.getExpressionValue() != null) {
+                predicate = new 
ExpressionToPredicateAdapter(definition.getExpressionValue());
+            } else if (definition.getExpression() != null) {
+                ObjectHelper.notNull("language", definition.getLanguage());
+                Language language = 
camelContext.resolveLanguage(definition.getLanguage());
+                if (language == null) {
+                    throw new 
NoSuchLanguageException(definition.getLanguage());
+                }
+                String exp = CamelContextHelper.parseText(camelContext, 
definition.getExpression());
+                // should be true by default
+                boolean isTrim = definition.getTrim() == null || 
CamelContextHelper.parseBoolean(camelContext, definition.getTrim());
+                // trim if configured to trim
+                if (exp != null && isTrim) {
+                    exp = exp.trim();
+                }
+                // resolve the expression as it may be an external script from
+                // the classpath/file etc
+                exp = ScriptHelper.resolveOptionalExternalScript(camelContext, 
exp);
+
+                predicate = language.createPredicate(exp);
+                configurePredicate(predicate);
+            }
+        }
+        // inject CamelContext if its aware
+        if (predicate instanceof CamelContextAware) {
+            ((CamelContextAware) predicate).setCamelContext(camelContext);
+        }
+        return predicate;
+    }
+
+    protected void configurePredicate(Predicate predicate) {
+        // allows to perform additional logic after the properties has been
+        // configured which may be needed
+        // in the various camel components outside camel-core
+        if (predicate instanceof AfterPropertiesConfigured) {
+            
((AfterPropertiesConfigured)predicate).afterPropertiesConfigured(camelContext);
+        }
+    }
+
+    protected void configureExpression(Expression expression) {
+        // allows to perform additional logic after the properties has been
+        // configured which may be needed
+        // in the various camel components outside camel-core
+        if (expression instanceof AfterPropertiesConfigured) {
+            
((AfterPropertiesConfigured)expression).afterPropertiesConfigured(camelContext);
+        }
+    }
+
+    protected void setProperties(Object target, Map<String, Object> 
properties) {
+        properties.entrySet().removeIf(e -> e.getValue() == null);
+        PropertyBindingSupport.build().bind(camelContext, target, properties);
+    }
+
+    protected Object or(Object a, Object b) {
+        return a != null ? a : b;
+    }
+
+    protected Object asRef(String s) {
+        return s != null ? s.startsWith("#") ? s : "#" + s : null;
+    }
+
+}
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
new file mode 100644
index 0000000..ea59a1c
--- /dev/null
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.reifier.language;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.JsonPathExpression;
+
+public class JsonPathExpressionReifier extends 
ExpressionReifier<JsonPathExpression> {
+
+    public JsonPathExpressionReifier(CamelContext camelContext, 
ExpressionDefinition definition) {
+        super(camelContext, (JsonPathExpression) definition);
+    }
+
+    @Override
+    protected void configureExpression(Expression expression) {
+        bindProperties(expression);
+        super.configureExpression(expression);
+    }
+
+    @Override
+    protected void configurePredicate(Predicate predicate) {
+        bindProperties(predicate);
+        super.configurePredicate(predicate);
+    }
+
+    private void bindProperties(Object target) {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("resultType", or(definition.getResultType(), 
definition.getResultTypeName()));
+        properties.put("suppressExceptions", 
definition.getSuppressExceptions());
+        properties.put("allowSimple", definition.getAllowSimple());
+        properties.put("allowEasyPredicate", 
definition.getAllowEasyPredicate());
+        properties.put("writeAsString", definition.getWriteAsString());
+        properties.put("headerName", definition.getHeaderName());
+        setProperties(target, properties);
+    }
+
+
+}
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
new file mode 100644
index 0000000..cdc14a4
--- /dev/null
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.reifier.language;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.AfterPropertiesConfigured;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.MethodCallExpression;
+import org.apache.camel.spi.Language;
+
+public class MethodCallExpressionReifier extends 
ExpressionReifier<MethodCallExpression> {
+
+    public MethodCallExpressionReifier(CamelContext camelContext, 
ExpressionDefinition definition) {
+        super(camelContext, (MethodCallExpression) definition);
+    }
+
+    @Override
+    public Expression createExpression() {
+        // special for bean language where we need to configure it first
+        Language lan = camelContext.resolveLanguage("bean");
+        configureLanguage(lan);
+        // .. and create expression with null value as we use the configured
+        // properties instead
+        Expression exp = lan.createExpression(null);
+        if (exp instanceof AfterPropertiesConfigured) {
+            
((AfterPropertiesConfigured)exp).afterPropertiesConfigured(camelContext);
+        }
+        return exp;
+    }
+
+    protected void configureLanguage(Language language) {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("bean", definition.getInstance());
+        properties.put("beanType", or(definition.getBeanType(), 
definition.getBeanTypeName()));
+        properties.put("ref", definition.getRef());
+        properties.put("method", definition.getMethod());
+        setProperties(language, properties);
+    }
+
+    @Override
+    public Predicate createPredicate() {
+        return (Predicate) createExpression();
+    }
+
+}
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/SimpleExpressionReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/SimpleExpressionReifier.java
new file mode 100644
index 0000000..807c807
--- /dev/null
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/SimpleExpressionReifier.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.reifier.language;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.builder.SimpleBuilder;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.SimpleExpression;
+import org.apache.camel.support.CamelContextHelper;
+
+public class SimpleExpressionReifier extends 
ExpressionReifier<SimpleExpression> {
+
+    public SimpleExpressionReifier(CamelContext camelContext, 
ExpressionDefinition definition) {
+        super(camelContext, (SimpleExpression) definition);
+    }
+
+    @Override
+    public Expression createExpression() {
+        String exp = parseString(definition.getExpression());
+        // should be true by default
+        boolean isTrim = definition.getTrim() == null || 
parseBoolean(definition.getTrim());
+        if (exp != null && isTrim) {
+            exp = exp.trim();
+        }
+
+        SimpleBuilder answer = new SimpleBuilder(exp);
+        answer.setResultType(CamelContextHelper.convertTo(camelContext, 
Class.class,
+                or(definition.getResultType(), 
definition.getResultTypeName())));
+        return answer;
+    }
+
+    @Override
+    public Predicate createPredicate() {
+        // SimpleBuilder is also a Predicate
+        return (Predicate) createExpression();
+    }
+
+}
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java
new file mode 100644
index 0000000..ff49e62
--- /dev/null
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.reifier.language;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.language.tokenizer.TokenizeLanguage;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.TokenizerExpression;
+import org.apache.camel.support.ExpressionToPredicateAdapter;
+
+public class TokenizerExpressionReifier extends 
ExpressionReifier<TokenizerExpression> {
+
+    public TokenizerExpressionReifier(CamelContext camelContext, 
ExpressionDefinition definition) {
+        super(camelContext, (TokenizerExpression) definition);
+    }
+
+    @Override
+    public Expression createExpression() {
+        // special for new line tokens, if defined from XML then its 2
+        // characters, so we replace that back to a single char
+        String token = definition.getToken();
+        if (token.startsWith("\\n")) {
+            token = '\n' + token.substring(2);
+        }
+
+        TokenizeLanguage language = new TokenizeLanguage();
+        language.setToken(parseString(token));
+        language.setEndToken(parseString(definition.getEndToken()));
+        
language.setInheritNamespaceTagName(parseString(definition.getInheritNamespaceTagName()));
+        language.setHeaderName(parseString(definition.getHeaderName()));
+        
language.setGroupDelimiter(parseString(definition.getGroupDelimiter()));
+        if (definition.getRegex() != null) {
+            language.setRegex(parseBoolean(definition.getRegex()));
+        }
+        if (definition.getXml() != null) {
+            language.setXml(parseBoolean(definition.getXml()));
+        }
+        if (definition.getIncludeTokens() != null) {
+            
language.setIncludeTokens(parseBoolean(definition.getIncludeTokens()));
+        }
+        if (definition.getGroup() != null && 
!"0".equals(definition.getGroup())) {
+            language.setGroup(parseString(definition.getGroup()));
+        }
+
+        if (definition.getSkipFirst() != null) {
+            language.setSkipFirst(parseBoolean(definition.getSkipFirst()));
+        }
+        return language.createExpression();
+    }
+
+    @Override
+    public Predicate createPredicate() {
+        Expression exp = createExpression();
+        return ExpressionToPredicateAdapter.toPredicate(exp);
+    }
+
+}
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
new file mode 100644
index 0000000..7595951
--- /dev/null
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.reifier.language;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.JsonPathExpression;
+import org.apache.camel.model.language.XMLTokenizerExpression;
+import org.apache.camel.spi.NamespaceAware;
+
+public class XMLTokenizerExpressionReifier extends 
ExpressionReifier<XMLTokenizerExpression> {
+
+    public XMLTokenizerExpressionReifier(CamelContext camelContext, 
ExpressionDefinition definition) {
+        super(camelContext, (XMLTokenizerExpression) definition);
+    }
+
+    @Override
+    protected void configureExpression(Expression expression) {
+        bindProperties(expression);
+        configureNamespaceAware(expression);
+        super.configureExpression(expression);
+    }
+
+    @Override
+    protected void configurePredicate(Predicate predicate) {
+        bindProperties(predicate);
+        configureNamespaceAware(predicate);
+        super.configurePredicate(predicate);
+    }
+
+    protected void configureNamespaceAware(Object builder) {
+        if (definition.getNamespaces() != null && builder instanceof 
NamespaceAware) {
+            NamespaceAware namespaceAware = (NamespaceAware)builder;
+            namespaceAware.setNamespaces(definition.getNamespaces());
+        }
+    }
+
+    protected void bindProperties(Object target) {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("headerName", definition.getHeaderName());
+        properties.put("mode", definition.getMode());
+        properties.put("group", definition.getGroup());
+        setProperties(target, properties);
+    }
+
+
+}
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
new file mode 100644
index 0000000..8737a07
--- /dev/null
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.reifier.language;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.XPathExpression;
+import org.apache.camel.spi.NamespaceAware;
+
+public class XPathExpressionReifier extends ExpressionReifier<XPathExpression> 
{
+
+    public XPathExpressionReifier(CamelContext camelContext, 
ExpressionDefinition definition) {
+        super(camelContext, (XPathExpression) definition);
+    }
+
+    @Override
+    protected void configureExpression(Expression expression) {
+        bindProperties(expression);
+        configureNamespaceAware(expression);
+        super.configureExpression(expression);
+    }
+
+    @Override
+    protected void configurePredicate(Predicate predicate) {
+        bindProperties(predicate);
+        configureNamespaceAware(predicate);
+        super.configurePredicate(predicate);
+    }
+
+    protected void configureNamespaceAware(Object builder) {
+        if (definition.getNamespaces() != null && builder instanceof 
NamespaceAware) {
+            NamespaceAware namespaceAware = (NamespaceAware)builder;
+            namespaceAware.setNamespaces(definition.getNamespaces());
+        }
+    }
+
+    protected void bindProperties(Object target) {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("documentType", or(definition.getDocumentType(), 
definition.getDocumentTypeName()));
+        properties.put("resultType", or(definition.getResultType(), 
definition.getResultTypeName()));
+        properties.put("useSaxon", definition.getSaxon());
+        properties.put("xPathFactory", or(definition.getXPathFactory(), 
asRef(definition.getFactoryRef())));
+        properties.put("objectModelUri", definition.getObjectModel());
+        properties.put("threadSafety", definition.getThreadSafety());
+        properties.put("logNamespaces", definition.getLogNamespaces());
+        properties.put("headerName", definition.getHeaderName());
+        setProperties(target, properties);
+    }
+
+}
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
new file mode 100644
index 0000000..f74d74f
--- /dev/null
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.reifier.language;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.XQueryExpression;
+import org.apache.camel.spi.NamespaceAware;
+
+public class XQueryExpressionReifier extends 
ExpressionReifier<XQueryExpression> {
+
+    public XQueryExpressionReifier(CamelContext camelContext, 
ExpressionDefinition definition) {
+        super(camelContext, (XQueryExpression) definition);
+    }
+
+    @Override
+    protected void configureExpression(Expression expression) {
+        bindProperties(expression);
+        configureNamespaceAware(expression);
+        super.configureExpression(expression);
+    }
+
+    @Override
+    protected void configurePredicate(Predicate predicate) {
+        bindProperties(predicate);
+        configureNamespaceAware(predicate);
+        super.configurePredicate(predicate);
+    }
+
+    protected void configureNamespaceAware(Object builder) {
+        if (definition.getNamespaces() != null && builder instanceof 
NamespaceAware) {
+            NamespaceAware namespaceAware = (NamespaceAware)builder;
+            namespaceAware.setNamespaces(definition.getNamespaces());
+        }
+    }
+
+    protected void bindProperties(Object target) {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("resultType", or(definition.getResultType(), 
definition.getType()));
+        properties.put("headerName", definition.getHeaderName());
+        setProperties(target, properties);
+    }
+
+}
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/loadbalancer/StickyLoadBalancerReifier.java
 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/loadbalancer/StickyLoadBalancerReifier.java
index a05102f..f908307 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/loadbalancer/StickyLoadBalancerReifier.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/loadbalancer/StickyLoadBalancerReifier.java
@@ -30,7 +30,7 @@ public class StickyLoadBalancerReifier extends 
LoadBalancerReifier<StickyLoadBal
 
     @Override
     public LoadBalancer createLoadBalancer() {
-        return new 
StickyLoadBalancer(definition.getCorrelationExpression().createExpression(routeContext));
+        return new 
StickyLoadBalancer(createExpression(definition.getCorrelationExpression()));
     }
 
 }

Reply via email to