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 <[email protected]> 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) + } +}
