diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java index c42c04fd7e15f..e4732f66ad32b 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java @@ -690,6 +690,7 @@ private void doStartRouteDefinitions(List routeDefinitions) thr // no side-effect from previously used values that Camel may use in its endpoint // registry and elsewhere if (bbr != null && !bbr.isEmpty()) { + Map beanNameMappings = new HashMap<>(); for (Map.Entry param : params.entrySet()) { Object value = param.getValue(); if (value instanceof String oldKey) { @@ -701,9 +702,18 @@ private void doStartRouteDefinitions(List routeDefinitions) thr routeDefinition.getId(), oldKey, newKey); bbrCopy.put(newKey, bbr.remove(oldKey)); param.setValue(newKey); + beanNameMappings.put(oldKey, newKey); } } } + // ensure bean names removed during clash detection are still + // available as template parameters so they can be referenced + // directly in routes via {{beanName}} + for (Map.Entry mapping : beanNameMappings.entrySet()) { + if (!params.containsKey(mapping.getKey())) { + params.put(mapping.getKey(), mapping.getValue()); + } + } // the remainder of the local beans must also have their ids made global unique for (Map.Entry, Object>> entry : bbr.entrySet()) { String oldKey = entry.getKey(); diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateLocalBeanTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateLocalBeanTest.java index f4dd6e8f6838c..bbe7097c2c0a1 100644 --- a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateLocalBeanTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateLocalBeanTest.java @@ -949,4 +949,36 @@ public static Processor createBuilderProcessorThree(String prefix) { return answer; } + @Test + public void testLocalBeanWithParamValueClash() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() { + routeTemplate("myTemplate") + .templateParameter("foo") + .templateParameter("scheme") + .templateBean("counter").typeClass(AtomicInteger.class).end() + .from("direct:{{foo}}") + .to("bean:{{counter}}?method=getAndIncrement"); + } + }); + + context.start(); + + TemplatedRouteBuilder.builder(context, "myTemplate") + .parameter("foo", "one") + .parameter("scheme", "counter") + .routeId("myRoute") + .add(); + + assertEquals(1, context.getRoutes().size()); + + Object out = template.requestBody("direct:one", "World"); + assertEquals(0, out); + out = template.requestBody("direct:one", "World"); + assertEquals(1, out); + + context.stop(); + } + }