You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2020/07/14 12:07:37 UTC

[camel-k-runtime] branch master updated: Property substitution doesn't happen in from URI #392

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

lburgazzoli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k-runtime.git


The following commit(s) were added to refs/heads/master by this push:
     new 00aeba6  Property substitution doesn't happen in from URI #392
00aeba6 is described below

commit 00aeba69a861327414df59e4d5c2c249f86d9a2e
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Tue Jul 14 11:13:01 2020 +0200

    Property substitution doesn't happen in from URI #392
---
 .../k/loader/yaml/parser/ChoiceStepParser.java     |  2 +-
 .../yaml/parser/CircuitBreakerStepParser.java      |  2 +-
 .../k/loader/yaml/parser/DoTryStepParser.java      |  2 +-
 .../loader/yaml/parser/ErrorHandlerStepParser.java |  2 +-
 .../k/loader/yaml/parser/FilterStepParser.java     |  2 +-
 .../camel/k/loader/yaml/parser/FromStepParser.java | 23 +----
 .../yaml/parser/IdempotentConsumerParser.java      |  2 +-
 .../loader/yaml/parser/LoadBalanceStepParser.java  |  2 +-
 .../camel/k/loader/yaml/parser/LoopStepParser.java |  2 +-
 .../k/loader/yaml/parser/MulticastStepParser.java  |  2 +-
 .../loader/yaml/parser/OnExceptionStepParser.java  |  2 +-
 .../k/loader/yaml/parser/PipelineStepParser.java   |  2 +-
 .../k/loader/yaml/parser/ResequenceStepParser.java |  2 +-
 .../camel/k/loader/yaml/parser/RestStepParser.java |  2 +-
 .../k/loader/yaml/parser/RouteStepParser.java      | 23 +----
 .../camel/k/loader/yaml/parser/SagaStepParser.java |  2 +-
 .../k/loader/yaml/parser/SampleStepParser.java     |  2 +-
 .../k/loader/yaml/parser/SplitStepParser.java      |  2 +-
 .../camel/k/loader/yaml/parser/StepStepParser.java |  2 +-
 .../k/loader/yaml/parser/ToDynamicStepParser.java  | 23 +----
 .../camel/k/loader/yaml/parser/ToStepParser.java   | 23 +----
 .../k/loader/yaml/parser/WireTapStepParser.java    | 24 +-----
 .../yaml/{spi => support}/StepParserSupport.java   | 26 +++++-
 .../k/loader/yaml/RouteWithPlaceholdersTest.groovy | 98 ++++++++++++++++++++++
 .../apache/camel/k/loader/yaml/RoutesTest.groovy   | 24 +++---
 .../apache/camel/k/loader/yaml/TestSupport.groovy  | 39 +++++----
 .../camel/k/loader/yaml/parser/ToTest.groovy       |  4 +-
 ...ed.yaml => RouteWithPlaceholdersTest_from.yaml} | 15 ++--
 ...d.yaml => RouteWithPlaceholdersTest_route.yaml} | 18 ++--
 ...dled.yaml => RouteWithPlaceholdersTest_to.yaml} | 20 +++--
 ...led.yaml => RouteWithPlaceholdersTest_tod.yaml} | 20 +++--
 .../routes/RoutesTest_onExceptionHandled.yaml      |  2 +-
 .../k/knative/yaml/parser/KnativeStepParser.java   |  2 +-
 .../apache/camel/component/knative/knative.json    |  2 +-
 34 files changed, 229 insertions(+), 191 deletions(-)

diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ChoiceStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ChoiceStepParser.java
index 96e15d5..c433a78 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ChoiceStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ChoiceStepParser.java
@@ -23,7 +23,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ChoiceDefinition;
 import org.apache.camel.model.OtherwiseDefinition;
 import org.apache.camel.model.ProcessorDefinition;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/CircuitBreakerStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/CircuitBreakerStepParser.java
index 685b1ec..94b2238 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/CircuitBreakerStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/CircuitBreakerStepParser.java
@@ -24,7 +24,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.CircuitBreakerDefinition;
 import org.apache.camel.model.HystrixConfigurationDefinition;
 import org.apache.camel.model.OnFallbackDefinition;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/DoTryStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/DoTryStepParser.java
index c608552..b2447a3 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/DoTryStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/DoTryStepParser.java
@@ -24,7 +24,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.CatchDefinition;
 import org.apache.camel.model.FinallyDefinition;
 import org.apache.camel.model.ProcessorDefinition;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ErrorHandlerStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ErrorHandlerStepParser.java
index f4c10ca..95f731f 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ErrorHandlerStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ErrorHandlerStepParser.java
@@ -26,7 +26,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
 import org.apache.camel.k.loader.yaml.spi.StartStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteDefinition;
 
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/FilterStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/FilterStepParser.java
index cb7ef13..1f2001d 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/FilterStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/FilterStepParser.java
@@ -23,7 +23,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.FilterDefinition;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.reifier.FilterReifier;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/FromStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/FromStepParser.java
index de986c0..b4424db 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/FromStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/FromStepParser.java
@@ -16,27 +16,23 @@
  */
 package org.apache.camel.k.loader.yaml.parser;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URISyntaxException;
 import java.util.List;
 import java.util.Map;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.StartStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.RouteDefinition;
-import org.apache.camel.util.URISupport;
 
 @YAMLStepParser(id = "from", definition = FromStepParser.Definition.class)
 public class FromStepParser implements StartStepParser {
     @Override
     public Object process(Context context) {
         final Definition definition = context.node(Definition.class);
-        final String uri = definition.getEndpointUri();
+        final String uri = StepParserSupport.createEndpointUri(definition.uri, definition.parameters);
         final RouteDefinition route = context.builder().from(uri);
 
         // as this is a start converter, steps are mandatory
@@ -57,21 +53,6 @@ public class FromStepParser implements StartStepParser {
         public Map<String, Object> parameters;
         @JsonProperty(required = true)
         public List<Step> steps;
-
-        @JsonIgnore
-        public String getEndpointUri() {
-            String answer = uri;
-
-            if (parameters != null) {
-                try {
-                    answer = URISupport.appendParametersToURI(answer, parameters);
-                } catch (URISyntaxException | UnsupportedEncodingException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-
-            return answer;
-        }
     }
 }
 
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/IdempotentConsumerParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/IdempotentConsumerParser.java
index 806ce65..2ca318f 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/IdempotentConsumerParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/IdempotentConsumerParser.java
@@ -23,7 +23,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.IdempotentConsumerDefinition;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.reifier.IdempotentConsumerReifier;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/LoadBalanceStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/LoadBalanceStepParser.java
index c13c1ff..dafdccf 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/LoadBalanceStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/LoadBalanceStepParser.java
@@ -27,7 +27,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ExpressionSubElementDefinition;
 import org.apache.camel.model.LoadBalanceDefinition;
 import org.apache.camel.model.LoadBalancerDefinition;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/LoopStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/LoopStepParser.java
index 5aa6f3b..e019767 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/LoopStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/LoopStepParser.java
@@ -23,7 +23,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.LoopDefinition;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.reifier.LoopReifier;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/MulticastStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/MulticastStepParser.java
index 10248c6..404e0df 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/MulticastStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/MulticastStepParser.java
@@ -23,7 +23,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.MulticastDefinition;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.reifier.MulticastReifier;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/OnExceptionStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/OnExceptionStepParser.java
index f734a9c..0620628 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/OnExceptionStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/OnExceptionStepParser.java
@@ -25,7 +25,7 @@ import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
 import org.apache.camel.k.loader.yaml.spi.StartStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ExpressionSubElementDefinition;
 import org.apache.camel.model.OnExceptionDefinition;
 import org.apache.camel.model.ProcessorDefinition;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/PipelineStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/PipelineStepParser.java
index e3835de..38bf466 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/PipelineStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/PipelineStepParser.java
@@ -23,7 +23,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.PipelineDefinition;
 import org.apache.camel.model.ProcessorDefinition;
 
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ResequenceStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ResequenceStepParser.java
index d3ad79f..4c62147 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ResequenceStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ResequenceStepParser.java
@@ -26,7 +26,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.ResequenceDefinition;
 import org.apache.camel.model.config.BatchResequencerConfig;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/RestStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/RestStepParser.java
index 5b97c71..32c6db4 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/RestStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/RestStepParser.java
@@ -25,7 +25,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.StartStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.rest.RestBindingMode;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.util.ObjectHelper;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/RouteStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/RouteStepParser.java
index b78dc03..602f36c 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/RouteStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/RouteStepParser.java
@@ -16,28 +16,24 @@
  */
 package org.apache.camel.k.loader.yaml.parser;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URISyntaxException;
 import java.util.List;
 import java.util.Map;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.StartStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.util.ObjectHelper;
-import org.apache.camel.util.URISupport;
 
 @YAMLStepParser(id = "route", definition = RouteStepParser.Definition.class)
 public class RouteStepParser implements StartStepParser {
     @Override
     public Object process(Context context) {
         final Definition definition = context.node(Definition.class);
-        final String uri = definition.from.getEndpointUri();
+        final String uri = StepParserSupport.createEndpointUri(definition.from.uri, definition.from.parameters);
         final RouteDefinition route = context.builder().from(uri);
 
         ObjectHelper.ifNotEmpty(definition.id, route::routeId);
@@ -78,21 +74,6 @@ public class RouteStepParser implements StartStepParser {
         public From(String uri) {
             this.uri = uri;
         }
-
-        @JsonIgnore
-        public String getEndpointUri() {
-            String answer = uri;
-
-            if (parameters != null) {
-                try {
-                    answer = URISupport.appendParametersToURI(answer, parameters);
-                } catch (URISyntaxException | UnsupportedEncodingException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-
-            return answer;
-        }
     }
 }
 
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SagaStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SagaStepParser.java
index ff15a3d..c5de7f8 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SagaStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SagaStepParser.java
@@ -23,7 +23,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.SagaDefinition;
 import org.apache.camel.reifier.SagaReifier;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SampleStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SampleStepParser.java
index 72fd80b..128a165 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SampleStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SampleStepParser.java
@@ -23,7 +23,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.SamplingDefinition;
 import org.apache.camel.reifier.SamplingReifier;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SplitStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SplitStepParser.java
index e5661c1..3191cc0 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SplitStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/SplitStepParser.java
@@ -23,7 +23,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.SplitDefinition;
 import org.apache.camel.reifier.SplitReifier;
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/StepStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/StepStepParser.java
index 7ddd352..e772406 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/StepStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/StepStepParser.java
@@ -23,7 +23,7 @@ import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.model.Step;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.StepDefinition;
 
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ToDynamicStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ToDynamicStepParser.java
index 932f3b6..183e915 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ToDynamicStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ToDynamicStepParser.java
@@ -16,25 +16,23 @@
  */
 package org.apache.camel.k.loader.yaml.parser;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URISyntaxException;
 import java.util.Map;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.ToDynamicDefinition;
-import org.apache.camel.util.URISupport;
 
 @YAMLStepParser(id = "tod", definition = ToDynamicStepParser.Definition.class)
 public class ToDynamicStepParser implements ProcessorStepParser {
     @Override
     public ProcessorDefinition<?> toProcessor(Context context) {
         final Definition definition = context.node(Definition.class);
-        final ToDynamicDefinition answer = new ToDynamicDefinition(definition.getEndpointUri());
+        final String uri = StepParserSupport.createEndpointUri(definition.getUri(), definition.parameters);
+        final ToDynamicDefinition answer = new ToDynamicDefinition(uri);
 
         return answer;
     }
@@ -50,21 +48,6 @@ public class ToDynamicStepParser implements ProcessorStepParser {
         public Definition(String uri) {
             super(uri);
         }
-
-        @JsonIgnore
-        public String getEndpointUri() {
-            String answer = getUri();
-
-            if (parameters != null) {
-                try {
-                    answer = URISupport.appendParametersToURI(answer, parameters);
-                } catch (URISyntaxException | UnsupportedEncodingException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-
-            return answer;
-        }
     }
 }
 
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ToStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ToStepParser.java
index 6308084..d31c05d 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ToStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/ToStepParser.java
@@ -16,25 +16,23 @@
  */
 package org.apache.camel.k.loader.yaml.parser;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URISyntaxException;
 import java.util.Map;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.ToDefinition;
-import org.apache.camel.util.URISupport;
 
 @YAMLStepParser(id = "to", definition = ToStepParser.Definition.class)
 public class ToStepParser implements ProcessorStepParser {
     @Override
     public ProcessorDefinition<?> toProcessor(Context context) {
         final Definition definition = context.node(Definition.class);
-        final ToDefinition answer = new ToDefinition(definition.getEndpointUri());
+        final String uri = StepParserSupport.createEndpointUri(definition.getUri(), definition.parameters);
+        final ToDefinition answer = new ToDefinition(uri);
 
         return answer;
     }
@@ -50,21 +48,6 @@ public class ToStepParser implements ProcessorStepParser {
         public Definition(String uri) {
             super(uri);
         }
-
-        @JsonIgnore
-        public String getEndpointUri() {
-            String answer = uri;
-
-            if (parameters != null) {
-                try {
-                    answer = URISupport.appendParametersToURI(answer, parameters);
-                } catch (URISyntaxException | UnsupportedEncodingException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-
-            return answer;
-        }
     }
 }
 
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/WireTapStepParser.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/WireTapStepParser.java
index 2b44652..7d4776d 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/WireTapStepParser.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/parser/WireTapStepParser.java
@@ -16,15 +16,13 @@
  */
 package org.apache.camel.k.loader.yaml.parser;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URISyntaxException;
 import java.util.List;
 import java.util.Map;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import org.apache.camel.k.annotation.yaml.YAMLNodeDefinition;
 import org.apache.camel.k.annotation.yaml.YAMLStepParser;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ExpressionSubElementDefinition;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.SetHeaderDefinition;
@@ -33,7 +31,6 @@ import org.apache.camel.model.WireTapDefinition;
 import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.reifier.WireTapReifier;
 import org.apache.camel.util.ObjectHelper;
-import org.apache.camel.util.URISupport;
 
 @YAMLStepParser(id = "wiretap", definition = WireTapStepParser.Definition.class)
 public class WireTapStepParser implements ProcessorStepParser {
@@ -56,7 +53,9 @@ public class WireTapStepParser implements ProcessorStepParser {
             }
         }
 
-        answer.setUri(definition.getEndpointUri());
+        answer.setUri(
+            StepParserSupport.createEndpointUri(definition.getUri(), definition.parameters)
+        );
 
         return answer;
     }
@@ -70,21 +69,6 @@ public class WireTapStepParser implements ProcessorStepParser {
         public Boolean dynamicUri;
         public NewExchangeDefinition newExchange;
         public Map<String, Object> parameters;
-
-        @JsonIgnore
-        public String getEndpointUri() {
-            String answer = getUri();
-
-            if (parameters != null) {
-                try {
-                    answer = URISupport.appendParametersToURI(answer, parameters);
-                } catch (URISyntaxException | UnsupportedEncodingException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-
-            return answer;
-        }
     }
 
     @YAMLNodeDefinition
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/spi/StepParserSupport.java b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/support/StepParserSupport.java
similarity index 66%
rename from camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/spi/StepParserSupport.java
rename to camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/support/StepParserSupport.java
index 014ec7b..388984b 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/spi/StepParserSupport.java
+++ b/camel-k-loader-yaml/camel-k-loader-yaml-common/src/main/java/org/apache/camel/k/loader/yaml/support/StepParserSupport.java
@@ -14,11 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.k.loader.yaml.spi;
+package org.apache.camel.k.loader.yaml.support;
 
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.camel.k.loader.yaml.model.Step;
+import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
+import org.apache.camel.k.loader.yaml.spi.StepParser;
+import org.apache.camel.k.loader.yaml.spi.StepParserException;
 import org.apache.camel.model.OutputNode;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.util.ObjectHelper;
@@ -35,7 +40,7 @@ public final class StepParserSupport {
         return value;
     }
 
-    public static ProcessorDefinition<?> convertSteps(ProcessorStepParser.Context context, ProcessorDefinition<?> parent, List<Step> steps) {
+    public static ProcessorDefinition<?> convertSteps(StepParser.Context context, ProcessorDefinition<?> parent, List<Step> steps) {
         ObjectHelper.notNull(context, "step context");
         ObjectHelper.notNull(parent, "parent");
 
@@ -60,4 +65,21 @@ public final class StepParserSupport {
 
         return parent;
     }
+
+    public static String createEndpointUri(String uri, Map<String, Object> parameters) {
+        String answer = uri;
+
+        if (parameters != null) {
+            String queryString = parameters.entrySet().stream()
+                .filter(entry -> entry.getValue() != null)
+                .map(entry -> String.format("%s=%s", entry.getKey(), entry.getValue()))
+                .collect(Collectors.joining("&"));
+
+            if (ObjectHelper.isNotEmpty(queryString)) {
+                answer += "?" + queryString;
+            }
+        }
+
+        return answer;
+    }
 }
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/RouteWithPlaceholdersTest.groovy b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/RouteWithPlaceholdersTest.groovy
new file mode 100644
index 0000000..eece082
--- /dev/null
+++ b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/RouteWithPlaceholdersTest.groovy
@@ -0,0 +1,98 @@
+/*
+ * 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.k.loader.yaml
+
+import org.apache.camel.component.direct.DirectEndpoint
+
+class RouteWithPlaceholdersTest extends TestSupport {
+    def 'route'() {
+        setup:
+            def parameters = [
+                'direct.id': 'myDirect',
+                'direct.timeout': 1234,
+                'direct.result': UUID.randomUUID().toString()
+            ]
+            def context = startContext {
+                propertiesComponent.initialProperties = parameters as Properties
+            }
+        when:
+            def uri = context.resolvePropertyPlaceholders('direct://{{direct.id}}?timeout={{direct.timeout}}')
+            def out = template(context).to(uri).request(String.class)
+        then:
+            out == parameters['direct.result']
+        cleanup:
+            context?.stop()
+    }
+    def 'from'() {
+        setup:
+            def parameters = [
+                'direct.id': 'myDirect',
+                'direct.timeout': 1234,
+                'direct.result': UUID.randomUUID().toString()
+            ]
+            def context = startContext {
+                propertiesComponent.initialProperties = parameters as Properties
+            }
+        when:
+            def uri = context.resolvePropertyPlaceholders('direct://{{direct.id}}?timeout={{direct.timeout}}')
+            def out = template(context).to(uri).request(String.class)
+            def eps = context.getEndpoints().find { it instanceof DirectEndpoint }
+        then:
+            out == parameters['direct.result']
+            with (eps, DirectEndpoint) {
+                timeout == parameters['direct.timeout']
+            }
+        cleanup:
+            context?.stop()
+    }
+
+    def 'to'() {
+        setup:
+            def parameters = [
+                'direct.id': 'myDirect',
+                'direct.timeout': 1234,
+                'direct.result': UUID.randomUUID().toString()
+            ]
+            def context = startContext {
+                propertiesComponent.initialProperties = parameters as Properties
+            }
+        when:
+            def out = template(context).to('direct:start').request(String.class)
+        then:
+            out == parameters['direct.result']
+        cleanup:
+            context?.stop()
+    }
+
+    def 'tod'() {
+        setup:
+            def parameters = [
+                'direct.id': 'myDirect',
+                'direct.timeout': 1234,
+                'direct.result': UUID.randomUUID().toString()
+            ]
+            def context = startContext {
+                propertiesComponent.initialProperties = parameters as Properties
+            }
+        when:
+            def out = template(context).to('direct:start').request(String.class)
+        then:
+            out == parameters['direct.result']
+        cleanup:
+            context?.stop()
+    }
+}
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/RoutesTest.groovy b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/RoutesTest.groovy
index 882e03a..29263cd 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/RoutesTest.groovy
+++ b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/RoutesTest.groovy
@@ -81,9 +81,9 @@ class RoutesTest extends TestSupport {
 
     def 'aggregator'() {
         setup:
-            def context = startContext([
-                'aggregatorStrategy': new UseLatestAggregationStrategy()
-            ])
+            def context = startContext {
+                registry.bind('aggregatorStrategy', new UseLatestAggregationStrategy())
+            }
 
             mockEndpoint(context, 'mock:route') {
                 expectedMessageCount 2
@@ -104,9 +104,9 @@ class RoutesTest extends TestSupport {
 
     def 'idempotentConsumer'() {
         setup:
-            def context = startContext([
-                'myRepo': new MemoryIdempotentRepository()
-            ])
+            def context = startContext {
+                registry.bind('myRepo', new MemoryIdempotentRepository())
+            }
 
             mockEndpoint(context,'mock:idempotent') {
                 expectedMessageCount = 3
@@ -132,9 +132,9 @@ class RoutesTest extends TestSupport {
 
     def 'onExceptionHandled'() {
         setup:
-            def context = startContext([
-                'myFailingProcessor' : new MyFailingProcessor()
-            ])
+            def context = startContext {
+                registry.bind('myFailingProcessor', new MyFailingProcessor())
+            }
         when:
             def out = context.createProducerTemplate().requestBody('direct:start', 'Hello World');
         then:
@@ -145,9 +145,9 @@ class RoutesTest extends TestSupport {
 
     def 'errorHandler'() {
         setup:
-            def context = startContext([
-                'myFailingProcessor' : new MyFailingProcessor()
-            ])
+            def context = startContext {
+                registry.bind('myFailingProcessor', new MyFailingProcessor())
+            }
 
             mockEndpoint(context, 'mock:on-error') {
                 expectedMessageCount = 1
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/TestSupport.groovy b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/TestSupport.groovy
index a2426a6..0971ad0 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/TestSupport.groovy
+++ b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/TestSupport.groovy
@@ -19,6 +19,7 @@ package org.apache.camel.k.loader.yaml
 import com.fasterxml.jackson.databind.JsonNode
 import groovy.util.logging.Slf4j
 import org.apache.camel.CamelContext
+import org.apache.camel.FluentProducerTemplate
 import org.apache.camel.builder.RouteBuilder
 import org.apache.camel.component.mock.MockEndpoint
 import org.apache.camel.impl.DefaultCamelContext
@@ -58,32 +59,37 @@ class TestSupport extends Specification {
     }
 
     static CamelContext startContext(String content) {
-        return startContext(content, [:])
+        return startContext(content, null)
     }
 
-    static CamelContext startContext(String content, Map<String, Object> beans) {
+    static CamelContext startContext(
+            String content,
+            @DelegatesTo(CamelContext) Closure<CamelContext> closure) {
         return startContext(
                 new ByteArrayInputStream(content.stripMargin().getBytes(StandardCharsets.UTF_8)),
-                beans
+                closure
         )
     }
 
     static CamelContext startContext(InputStream content) {
-        return startContext(content, [:])
+        return startContext(content, null)
     }
 
-    static CamelContext startContext(InputStream content, Map<String, Object> beans) {
+    static CamelContext startContext(
+            InputStream content,
+            @DelegatesTo(CamelContext) Closure closure) {
         def context = new DefaultCamelContext()
         def builder = new YamlSourceLoader().builder(content)
 
-        if (beans) {
-            beans.each {
-                k, v -> context.registry.bind(k, v)
-            }
-        }
-
         context.disableJMX()
         context.setStreamCaching(true)
+
+        if (closure) {
+            closure.resolveStrategy = Closure.DELEGATE_ONLY
+            closure.delegate = context
+            closure.call()
+        }
+
         context.addRoutes(builder)
         context.start()
 
@@ -91,16 +97,16 @@ class TestSupport extends Specification {
     }
 
     CamelContext startContext() {
-        return startContext([:])
+        return startContext(null as Closure)
     }
 
-    CamelContext startContext(Map<String, Object> beans) {
+    CamelContext startContext(@DelegatesTo(CamelContext) Closure closure) {
         def name = specificationContext.currentIteration.name.replace(' ', '_')
         def path = "/routes/${specificationContext.currentSpec.name}_${name}.yaml"
 
         return startContext(
                 TestSupport.class.getResourceAsStream(path) as InputStream,
-                beans
+                closure
         )
     }
 
@@ -136,4 +142,9 @@ class TestSupport extends Specification {
         }
         throw new IllegalArgumentException("No parser of ${id}")
     }
+
+    static FluentProducerTemplate template(CamelContext context) {
+        return context.createFluentProducerTemplate()
+    }
+
 }
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/parser/ToTest.groovy b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/parser/ToTest.groovy
index bfd54ae..a60db22 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/parser/ToTest.groovy
+++ b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/groovy/org/apache/camel/k/loader/yaml/parser/ToTest.groovy
@@ -33,7 +33,7 @@ class ToTest extends TestSupport {
             def processor = new ToStepParser().toProcessor(stepContext)
         then:
             with(processor, ToDefinition) {
-                endpointUri == 'seda://test?queueSize=1'
+                endpointUri ==~  /seda:(\/\/)?test\?queueSize=1/
             }
     }
 
@@ -45,7 +45,7 @@ class ToTest extends TestSupport {
             def processor = new ToStepParser().toProcessor(stepContext)
         then:
             with(processor, ToDefinition) {
-                endpointUri == 'seda://test'
+                endpointUri ==~ /seda:(\/\/)?test/
             }
     }
 }
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_from.yaml
similarity index 76%
copy from camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml
copy to camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_from.yaml
index 3bd3bcb..c5df343 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml
+++ b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_from.yaml
@@ -14,15 +14,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-- on-exception:
-    exceptioons:
-      - org.apache.camel.k.loader.yaml.support.MyException
-    handled: true
-    steps:
-      - transform:
-          constant: "Sorry"
 - from:
-    uri: "direct:start"
+    uri: "direct:{{direct.id}}"
+    parameters:
+      timeout: "{{direct.timeout}}"
     steps:
-      - process:
-          ref: "myFailingProcessor"
\ No newline at end of file
+      - set-body:
+          constant: "{{direct.result}}"
\ No newline at end of file
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_route.yaml
similarity index 75%
copy from camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml
copy to camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_route.yaml
index 3bd3bcb..08e9791 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml
+++ b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_route.yaml
@@ -14,15 +14,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-- on-exception:
-    exceptioons:
-      - org.apache.camel.k.loader.yaml.support.MyException
-    handled: true
+- route:
+    from:
+      uri: "direct:{{direct.id}}"
+      parameters:
+        timeout: "{{direct.timeout}}"
     steps:
-      - transform:
-          constant: "Sorry"
-- from:
-    uri: "direct:start"
-    steps:
-      - process:
-          ref: "myFailingProcessor"
\ No newline at end of file
+      - set-body:
+          constant: "{{direct.result}}"
\ No newline at end of file
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_to.yaml
similarity index 76%
copy from camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml
copy to camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_to.yaml
index 3bd3bcb..a42700e 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml
+++ b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_to.yaml
@@ -14,15 +14,17 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-- on-exception:
-    exceptioons:
-      - org.apache.camel.k.loader.yaml.support.MyException
-    handled: true
-    steps:
-      - transform:
-          constant: "Sorry"
 - from:
     uri: "direct:start"
     steps:
-      - process:
-          ref: "myFailingProcessor"
\ No newline at end of file
+      - to:
+          uri: "direct:{{direct.id}}"
+          parameters:
+            timeout: "{{direct.timeout}}"
+- from:
+    uri: "direct:{{direct.id}}"
+    parameters:
+      timeout: "{{direct.timeout}}"
+    steps:
+      - set-body:
+          constant: "{{direct.result}}"
\ No newline at end of file
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_tod.yaml
similarity index 76%
copy from camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml
copy to camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_tod.yaml
index 3bd3bcb..1ff60fd 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml
+++ b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RouteWithPlaceholdersTest_tod.yaml
@@ -14,15 +14,17 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-- on-exception:
-    exceptioons:
-      - org.apache.camel.k.loader.yaml.support.MyException
-    handled: true
-    steps:
-      - transform:
-          constant: "Sorry"
 - from:
     uri: "direct:start"
     steps:
-      - process:
-          ref: "myFailingProcessor"
\ No newline at end of file
+      - tod:
+          uri: "direct:{{direct.id}}"
+          parameters:
+            timeout: "{{direct.timeout}}"
+- from:
+    uri: "direct:{{direct.id}}"
+    parameters:
+      timeout: "{{direct.timeout}}"
+    steps:
+      - set-body:
+          constant: "{{direct.result}}"
\ No newline at end of file
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml
index 3bd3bcb..56d5a17 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml
+++ b/camel-k-loader-yaml/camel-k-loader-yaml/src/test/resources/routes/RoutesTest_onExceptionHandled.yaml
@@ -15,7 +15,7 @@
 # limitations under the License.
 #
 - on-exception:
-    exceptioons:
+    exceptions:
       - org.apache.camel.k.loader.yaml.support.MyException
     handled: true
     steps:
diff --git a/camel-k-runtime-knative/src/main/java/org/apache/camel/k/knative/yaml/parser/KnativeStepParser.java b/camel-k-runtime-knative/src/main/java/org/apache/camel/k/knative/yaml/parser/KnativeStepParser.java
index 8e07785..0027a61 100644
--- a/camel-k-runtime-knative/src/main/java/org/apache/camel/k/knative/yaml/parser/KnativeStepParser.java
+++ b/camel-k-runtime-knative/src/main/java/org/apache/camel/k/knative/yaml/parser/KnativeStepParser.java
@@ -25,7 +25,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import org.apache.camel.component.knative.spi.Knative;
 import org.apache.camel.k.loader.yaml.spi.ProcessorStepParser;
 import org.apache.camel.k.loader.yaml.spi.StartStepParser;
-import org.apache.camel.k.loader.yaml.spi.StepParserSupport;
+import org.apache.camel.k.loader.yaml.support.StepParserSupport;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.ToDefinition;
diff --git a/camel-knative/camel-knative/src/generated/resources/org/apache/camel/component/knative/knative.json b/camel-knative/camel-knative/src/generated/resources/org/apache/camel/component/knative/knative.json
index 24c9cd1..12371c6 100644
--- a/camel-knative/camel-knative/src/generated/resources/org/apache/camel/component/knative/knative.json
+++ b/camel-knative/camel-knative/src/generated/resources/org/apache/camel/component/knative/knative.json
@@ -11,7 +11,7 @@
     "supportLevel": "Preview",
     "groupId": "org.apache.camel.k",
     "artifactId": "camel-knative",
-    "version": "1.4.0-SNAPSHOT",
+    "version": "1.5.0-SNAPSHOT",
     "scheme": "knative",
     "extendsScheme": "",
     "syntax": "knative:type\/name",