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

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


The following commit(s) were added to refs/heads/main by this push:
     new c1b135d51338 CAMEL-23652: Fix route template local bean not found when 
param value matches bean name (#23713)
c1b135d51338 is described below

commit c1b135d513382ead6f0aac057942e892ae582f53
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Jun 2 21:40:45 2026 +0200

    CAMEL-23652: Fix route template local bean not found when param value 
matches bean name (#23713)
    
    When a template parameter value coincidentally matches a local bean name
    (e.g., scheme=counter where counter is also a bean), the bean uniqueness
    logic removed the bean from the registry but failed to add the bean name
    as a template parameter, making {{beanName}} references unresolvable.
    
    Co-authored-by: Claude Opus 4.6 <[email protected]>
---
 .../org/apache/camel/impl/DefaultCamelContext.java | 10 +++++++
 .../camel/builder/RouteTemplateLocalBeanTest.java  | 32 ++++++++++++++++++++++
 2 files changed, 42 insertions(+)

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 c42c04fd7e15..e4732f66ad32 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 @@ public class DefaultCamelContext extends SimpleCamelContext 
implements ModelCame
                     // no side-effect from previously used values that Camel 
may use in its endpoint
                     // registry and elsewhere
                     if (bbr != null && !bbr.isEmpty()) {
+                        Map<String, String> beanNameMappings = new HashMap<>();
                         for (Map.Entry<String, Object> param : 
params.entrySet()) {
                             Object value = param.getValue();
                             if (value instanceof String oldKey) {
@@ -701,9 +702,18 @@ public class DefaultCamelContext extends 
SimpleCamelContext implements ModelCame
                                             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<String, String> 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<String, Map<Class<?>, 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 f4dd6e8f6838..bbe7097c2c0a 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 class RouteTemplateLocalBeanTest extends 
ContextTestSupport {
         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();
+    }
+
 }

Reply via email to