You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/07/06 10:22:58 UTC

[camel] 02/03: CAMEL-16757: camel-core - Global error handling, interceptor in all DSL

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

davsclaus pushed a commit to branch CAMEL-16757
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 7793f70a8decdb58f9d620064fc7aebe289c8e08
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jul 6 12:17:36 2021 +0200

    CAMEL-16757: camel-core - Global error handling, interceptor in all DSL
---
 .../camel/model/RouteTemplatesDefinition.java      |  3 +-
 .../org/apache/camel/model/RoutesDefinition.java   |  4 +-
 .../apache/camel/model/rest/RestsDefinition.java   |  3 +-
 .../camel-yaml-dsl-deserializers/pom.xml           |  1 +
 .../dsl/yaml/deserializers/ModelDeserializers.java | 70 ----------------------
 .../deserializers/ModelDeserializersResolver.java  |  2 -
 .../dsl/yaml/deserializers/CustomResolver.java     |  3 +
 .../RoutesConfigurationDefinitionDeserializer.java | 70 ++++++++++++++++++++++
 .../src/generated/resources/camel-yaml-dsl.json    | 66 ++++++++++----------
 .../camel/dsl/yaml/YamlRoutesBuilderLoader.java    | 12 ++++
 .../camel/dsl/yaml/RoutesConfigurationTest.groovy  | 61 +++++++++++++++++++
 11 files changed, 189 insertions(+), 106 deletions(-)

diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplatesDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplatesDefinition.java
index c06a722..0beaddd 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplatesDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplatesDefinition.java
@@ -26,6 +26,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.spi.Metadata;
 
@@ -36,7 +37,7 @@ import org.apache.camel.spi.Metadata;
 @XmlRootElement(name = "routeTemplates")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class RouteTemplatesDefinition extends OptionalIdentifiedDefinition<RouteTemplatesDefinition>
-        implements RouteTemplateContainer {
+        implements RouteTemplateContainer, CamelContextAware {
     @XmlElementRef
     private List<RouteTemplateDefinition> routeTemplates = new ArrayList<>();
     @XmlTransient
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
index 6f18e08..8b17df1 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
@@ -26,6 +26,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.Endpoint;
 import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.builder.EndpointConsumerBuilder;
@@ -38,7 +39,8 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "configuration")
 @XmlRootElement(name = "routes")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class RoutesDefinition extends OptionalIdentifiedDefinition<RoutesDefinition> implements RouteContainer {
+public class RoutesDefinition extends OptionalIdentifiedDefinition<RoutesDefinition>
+        implements RouteContainer, CamelContextAware {
     @XmlElementRef
     private List<RouteDefinition> routes = new ArrayList<>();
     // TODO: Use RoutesConfigurationDefinition instead
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestsDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestsDefinition.java
index 06f272e..3b8b150 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestsDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestsDefinition.java
@@ -26,6 +26,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.model.OptionalIdentifiedDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -35,7 +36,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "rest")
 @XmlRootElement(name = "rests")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class RestsDefinition extends OptionalIdentifiedDefinition<RestsDefinition> implements RestContainer {
+public class RestsDefinition extends OptionalIdentifiedDefinition<RestsDefinition> implements RestContainer, CamelContextAware {
     @XmlElementRef
     private List<RestDefinition> rests = new ArrayList<>();
     @XmlTransient
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
index 3ccadeb..0403a1c 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
@@ -134,6 +134,7 @@
                                 <bannedDefinition>org.apache.camel.model.RouteTemplateBeanDefinition</bannedDefinition>
                                 <bannedDefinition>org.apache.camel.model.RoutesDefinition</bannedDefinition>
                                 <bannedDefinition>org.apache.camel.model.RestsDefinition</bannedDefinition>
+                                <bannedDefinition>org.apache.camel.model.RoutesConfigurationDefinition</bannedDefinition>
                             </bannedDefinitions>
                             <additionalDefinitions>
                                 <!-- saga -->
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index 666b14d..56ecd7b 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -73,7 +73,6 @@ import org.apache.camel.model.RouteContextRefDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RouteTemplateParameterDefinition;
 import org.apache.camel.model.RouteTemplateScriptDefinition;
-import org.apache.camel.model.RoutesConfigurationDefinition;
 import org.apache.camel.model.RoutingSlipDefinition;
 import org.apache.camel.model.SagaActionUriDefinition;
 import org.apache.camel.model.SagaDefinition;
@@ -12881,75 +12880,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
     }
 
     @YamlType(
-            types = org.apache.camel.model.RoutesConfigurationDefinition.class,
-            order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
-            nodes = "routes-configuration",
-            properties = {
-                    @YamlProperty(name = "intercept", type = "array:org.apache.camel.model.InterceptDefinition"),
-                    @YamlProperty(name = "intercept-from", type = "array:org.apache.camel.model.InterceptFromDefinition"),
-                    @YamlProperty(name = "intercept-send-to-endpoint", type = "array:org.apache.camel.model.InterceptSendToEndpointDefinition"),
-                    @YamlProperty(name = "on-completion", type = "array:org.apache.camel.model.OnCompletionDefinition"),
-                    @YamlProperty(name = "on-exception", type = "array:org.apache.camel.model.OnExceptionDefinition")
-            }
-    )
-    public static class RoutesConfigurationDefinitionDeserializer extends YamlDeserializerBase<RoutesConfigurationDefinition> {
-        public RoutesConfigurationDefinitionDeserializer() {
-            super(RoutesConfigurationDefinition.class);
-        }
-
-        @Override
-        protected RoutesConfigurationDefinition newInstance() {
-            return new RoutesConfigurationDefinition();
-        }
-
-        @Override
-        protected boolean setProperty(RoutesConfigurationDefinition target, String propertyKey,
-                String propertyName, Node node) {
-            switch(propertyKey) {
-                case "intercept-from": {
-                    java.util.List<org.apache.camel.model.InterceptFromDefinition> val = asFlatList(node, org.apache.camel.model.InterceptFromDefinition.class);
-                    target.setInterceptFroms(val);
-                    break;
-                }
-                case "intercept-send-to-endpoint": {
-                    java.util.List<org.apache.camel.model.InterceptSendToEndpointDefinition> val = asFlatList(node, org.apache.camel.model.InterceptSendToEndpointDefinition.class);
-                    target.setInterceptSendTos(val);
-                    break;
-                }
-                case "intercept": {
-                    java.util.List<org.apache.camel.model.InterceptDefinition> val = asFlatList(node, org.apache.camel.model.InterceptDefinition.class);
-                    target.setIntercepts(val);
-                    break;
-                }
-                case "on-completion": {
-                    java.util.List<org.apache.camel.model.OnCompletionDefinition> val = asFlatList(node, org.apache.camel.model.OnCompletionDefinition.class);
-                    target.setOnCompletions(val);
-                    break;
-                }
-                case "on-exception": {
-                    java.util.List<org.apache.camel.model.OnExceptionDefinition> val = asFlatList(node, org.apache.camel.model.OnExceptionDefinition.class);
-                    target.setOnExceptions(val);
-                    break;
-                }
-                case "id": {
-                    String val = asText(node);
-                    target.setId(val);
-                    break;
-                }
-                case "description": {
-                    org.apache.camel.model.DescriptionDefinition val = asType(node, org.apache.camel.model.DescriptionDefinition.class);
-                    target.setDescription(val);
-                    break;
-                }
-                default: {
-                    return false;
-                }
-            }
-            return true;
-        }
-    }
-
-    @YamlType(
             inline = true,
             types = org.apache.camel.model.RoutingSlipDefinition.class,
             order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
index f525761..965e470 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
@@ -304,8 +304,6 @@ public final class ModelDeserializersResolver implements YamlDeserializerResolve
             case "org.apache.camel.model.RouteTemplateParameterDefinition": return new ModelDeserializers.RouteTemplateParameterDefinitionDeserializer();
             case "template-script": return new ModelDeserializers.RouteTemplateScriptDefinitionDeserializer();
             case "org.apache.camel.model.RouteTemplateScriptDefinition": return new ModelDeserializers.RouteTemplateScriptDefinitionDeserializer();
-            case "routes-configuration": return new ModelDeserializers.RoutesConfigurationDefinitionDeserializer();
-            case "org.apache.camel.model.RoutesConfigurationDefinition": return new ModelDeserializers.RoutesConfigurationDefinitionDeserializer();
             case "routing-slip": return new ModelDeserializers.RoutingSlipDefinitionDeserializer();
             case "org.apache.camel.model.RoutingSlipDefinition": return new ModelDeserializers.RoutingSlipDefinitionDeserializer();
             case "rss": return new ModelDeserializers.RssDataFormatDeserializer();
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
index 08ac067..6dc4791 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
@@ -38,6 +38,9 @@ public class CustomResolver implements YamlDeserializerResolver {
             case "route":
             case "org.apache.camel.model.RouteDefinition":
                 return new RouteDefinitionDeserializer();
+            case "routes-configuration":
+            case "org.apache.camel.model.RoutesConfigurationDefinition":
+                return new RoutesConfigurationDefinitionDeserializer();
             case "template":
             case "org.apache.camel.model.RouteTemplateDefinition":
                 return new RouteTemplateDefinitionDeserializer();
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RoutesConfigurationDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RoutesConfigurationDefinitionDeserializer.java
new file mode 100644
index 0000000..314f8f2
--- /dev/null
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RoutesConfigurationDefinitionDeserializer.java
@@ -0,0 +1,70 @@
+package org.apache.camel.dsl.yaml.deserializers;
+
+import org.apache.camel.dsl.yaml.common.YamlDeserializationContext;
+import org.apache.camel.dsl.yaml.common.YamlDeserializerBase;
+import org.apache.camel.dsl.yaml.common.YamlDeserializerResolver;
+import org.apache.camel.model.OnExceptionDefinition;
+import org.apache.camel.model.RoutesConfigurationDefinition;
+import org.apache.camel.spi.CamelContextCustomizer;
+import org.apache.camel.spi.annotations.YamlProperty;
+import org.apache.camel.spi.annotations.YamlType;
+import org.snakeyaml.engine.v2.nodes.MappingNode;
+import org.snakeyaml.engine.v2.nodes.Node;
+import org.snakeyaml.engine.v2.nodes.NodeTuple;
+import org.snakeyaml.engine.v2.nodes.NodeType;
+import org.snakeyaml.engine.v2.nodes.ScalarNode;
+import org.snakeyaml.engine.v2.nodes.SequenceNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@YamlType(
+          inline = true,
+          types = org.apache.camel.model.RoutesConfigurationDefinition.class,
+          order = YamlDeserializerResolver.ORDER_DEFAULT,
+          nodes = "routes-configuration",
+          properties = {
+                  @YamlProperty(name = "intercept", type = "array:org.apache.camel.model.InterceptDefinition"),
+                  @YamlProperty(name = "intercept-from", type = "array:org.apache.camel.model.InterceptFromDefinition"),
+                  @YamlProperty(name = "intercept-send-to-endpoint",
+                                type = "array:org.apache.camel.model.InterceptSendToEndpointDefinition"),
+                  @YamlProperty(name = "on-completion", type = "array:org.apache.camel.model.OnCompletionDefinition"),
+                  @YamlProperty(name = "on-exception", type = "array:org.apache.camel.model.OnExceptionDefinition")
+          })
+public class RoutesConfigurationDefinitionDeserializer extends YamlDeserializerBase<RoutesConfigurationDefinition> {
+    public RoutesConfigurationDefinitionDeserializer() {
+        super(RoutesConfigurationDefinition.class);
+    }
+
+    @Override
+    protected RoutesConfigurationDefinition newInstance() {
+        return new RoutesConfigurationDefinition();
+    }
+
+    @Override
+    public Object construct(Node node) {
+        final RoutesConfigurationDefinition target = newInstance();
+
+        final YamlDeserializationContext dc = getDeserializationContext(node);
+        final SequenceNode sn = asSequenceNode(node);
+        for (Node item : sn.getValue()) {
+            final MappingNode bn = asMappingNode(item);
+            setDeserializationContext(item, dc);
+
+            for (NodeTuple tuple : bn.getValue()) {
+                final String key = asText(tuple.getKeyNode());
+                final Node val = tuple.getValueNode();
+                switch (key) {
+                    case "on-exception":
+                        setDeserializationContext(val, dc);
+                        OnExceptionDefinition obj = asType(val, OnExceptionDefinition.class);
+                        target.getOnExceptions().add(obj);
+                        break;
+                }
+            }
+        }
+
+        return target;
+    }
+
+}
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
index 031f947..3708e2f 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
@@ -2151,39 +2151,43 @@
         } ]
       },
       "org.apache.camel.model.RoutesConfigurationDefinition" : {
-        "type" : "object",
-        "properties" : {
-          "intercept" : {
-            "type" : "array",
-            "items" : {
-              "$ref" : "#/items/definitions/org.apache.camel.model.InterceptDefinition"
-            }
-          },
-          "intercept-from" : {
-            "type" : "array",
-            "items" : {
-              "$ref" : "#/items/definitions/org.apache.camel.model.InterceptFromDefinition"
-            }
-          },
-          "intercept-send-to-endpoint" : {
-            "type" : "array",
-            "items" : {
-              "$ref" : "#/items/definitions/org.apache.camel.model.InterceptSendToEndpointDefinition"
-            }
-          },
-          "on-completion" : {
-            "type" : "array",
-            "items" : {
-              "$ref" : "#/items/definitions/org.apache.camel.model.OnCompletionDefinition"
-            }
-          },
-          "on-exception" : {
-            "type" : "array",
-            "items" : {
-              "$ref" : "#/items/definitions/org.apache.camel.model.OnExceptionDefinition"
+        "oneOf" : [ {
+          "type" : "string"
+        }, {
+          "type" : "object",
+          "properties" : {
+            "intercept" : {
+              "type" : "array",
+              "items" : {
+                "$ref" : "#/items/definitions/org.apache.camel.model.InterceptDefinition"
+              }
+            },
+            "intercept-from" : {
+              "type" : "array",
+              "items" : {
+                "$ref" : "#/items/definitions/org.apache.camel.model.InterceptFromDefinition"
+              }
+            },
+            "intercept-send-to-endpoint" : {
+              "type" : "array",
+              "items" : {
+                "$ref" : "#/items/definitions/org.apache.camel.model.InterceptSendToEndpointDefinition"
+              }
+            },
+            "on-completion" : {
+              "type" : "array",
+              "items" : {
+                "$ref" : "#/items/definitions/org.apache.camel.model.OnCompletionDefinition"
+              }
+            },
+            "on-exception" : {
+              "type" : "array",
+              "items" : {
+                "$ref" : "#/items/definitions/org.apache.camel.model.OnExceptionDefinition"
+              }
             }
           }
-        }
+        } ]
       },
       "org.apache.camel.model.RoutingSlipDefinition" : {
         "oneOf" : [ {
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
index d16728d..15a4057 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
@@ -16,13 +16,16 @@
  */
 package org.apache.camel.dsl.yaml;
 
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.dsl.yaml.deserializers.OutputAwareFromDefinition;
+import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.OnExceptionDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RouteTemplateDefinition;
+import org.apache.camel.model.RoutesConfigurationDefinition;
 import org.apache.camel.model.rest.RestConfigurationDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.VerbDefinition;
@@ -52,16 +55,23 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
                         RouteDefinition route = new RouteDefinition();
                         route.setInput(((OutputAwareFromDefinition) item).getDelegate());
                         route.setOutputs(((OutputAwareFromDefinition) item).getOutputs());
+
+                        CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
                         getRouteCollection().route(route);
                     } else if (item instanceof RouteDefinition) {
+                        CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
                         getRouteCollection().route((RouteDefinition) item);
                     } else if (item instanceof CamelContextCustomizer) {
                         ((CamelContextCustomizer) item).configure(getCamelContext());
+                    } else if (item instanceof RoutesConfigurationDefinition) {
+                        getContext().adapt(ModelCamelContext.class)
+                                .addRoutesConfiguration((RoutesConfigurationDefinition) item);
                     } else if (item instanceof OnExceptionDefinition) {
                         if (!getRouteCollection().getRoutes().isEmpty()) {
                             throw new IllegalArgumentException(
                                     "onException must be defined before any routes in the RouteBuilder");
                         }
+                        CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
                         getRouteCollection().getOnExceptions().add((OnExceptionDefinition) item);
                     } else if (item instanceof ErrorHandlerBuilder) {
                         if (!getRouteCollection().getRoutes().isEmpty()) {
@@ -70,12 +80,14 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
                         }
                         errorHandler((ErrorHandlerBuilder) item);
                     } else if (item instanceof RouteTemplateDefinition) {
+                        CamelContextAware.trySetCamelContext(getRouteTemplateCollection(), getCamelContext());
                         getRouteTemplateCollection().routeTemplate((RouteTemplateDefinition) item);
                     } else if (item instanceof RestDefinition) {
                         RestDefinition definition = (RestDefinition) item;
                         for (VerbDefinition verb : definition.getVerbs()) {
                             verb.setRest(definition);
                         }
+                        CamelContextAware.trySetCamelContext(getRestCollection(), getCamelContext());
                         getRestCollection().rest(definition);
                     } else if (item instanceof RestConfigurationDefinition) {
                         ((RestConfigurationDefinition) item).asRestConfiguration(
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesConfigurationTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesConfigurationTest.groovy
new file mode 100644
index 0000000..427748a
--- /dev/null
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesConfigurationTest.groovy
@@ -0,0 +1,61 @@
+/*
+ * 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.dsl.yaml
+
+import org.apache.camel.component.mock.MockEndpoint
+import org.apache.camel.dsl.yaml.support.YamlTestSupport
+import org.apache.camel.dsl.yaml.support.model.MyException
+import org.apache.camel.dsl.yaml.support.model.MyFailingProcessor
+
+class RoutesConfigurationTest extends YamlTestSupport {
+    def "routes-configuration"() {
+        setup:
+            loadRoutes """
+                - beans:
+                  - name: myFailingProcessor
+                    type: ${MyFailingProcessor.name}
+                - routes-configuration:
+                    - on-exception:
+                        handled:
+                          constant: "true"
+                        exception:
+                          - ${MyException.name}
+                        steps:
+                          - transform:
+                              constant: "Sorry"
+                          - to: "mock:on-exception"  
+                - from:
+                    uri: "direct:start"
+                    steps:
+                      - process: 
+                          ref: "myFailingProcessor"            
+            """
+
+            withMock('mock:on-exception') {
+                expectedBodiesReceived 'Sorry'
+            }
+
+        when:
+            context.start()
+
+            withTemplate {
+                to('direct:start').withBody('hello').send()
+            }
+        then:
+            MockEndpoint.assertIsSatisfied(context)
+    }
+}