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

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


The following commit(s) were added to refs/heads/camel-4.10.x by this push:
     new bcb8ab34f93 CAMEL-22055: camel-main - Loaded Java routes may be 
dependency injected twice (#18016)
bcb8ab34f93 is described below

commit bcb8ab34f93a72c7e246de2cbdb24fd8893e1385
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Sat May 10 20:23:43 2025 +0200

    CAMEL-22055: camel-main - Loaded Java routes may be dependency injected 
twice (#18016)
---
 .../java/org/apache/camel/main/RoutesConfigurer.java    |  8 ++++----
 .../camel/dsl/java/joor/JavaRoutesBuilderLoader.java    | 11 ++++++++++-
 .../{JavaMultiCompileTest.java => JavaMainIoCTest.java} | 12 ++++++------
 .../camel/dsl/java/joor/JavaMultiCompileTest.java       |  4 ++++
 .../routes/{MyBarEcho.java => IoCWithBeanMethod.java}   | 17 ++++++++++++-----
 .../src/test/resources/routes/MyBarEcho.java            | 16 ++++++++++++++++
 6 files changed, 52 insertions(+), 16 deletions(-)

diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java 
b/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
index f7cbd2cd21a..7e396d8a7f5 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
@@ -178,9 +178,8 @@ public class RoutesConfigurer {
                         LOG.warn("Unable to resolve class: {}", routeClass);
                         continue;
                     }
-
-                    // lets use Camel's injector so the class has some support 
for dependency injection
-                    RoutesBuilder builder = 
camelContext.getInjector().newInstance(routeClazz);
+                    // do not post process as we do this later
+                    RoutesBuilder builder = 
camelContext.getInjector().newInstance(routeClazz, false);
                     routes.add(builder);
                 } catch (Exception e) {
                     if (isIgnoreLoadingError()) {
@@ -218,7 +217,8 @@ public class RoutesConfigurer {
                         continue;
                     }
                     try {
-                        Object builder = 
camelContext.getInjector().newInstance(routeClazz);
+                        // do not post process as we do this later
+                        Object builder = 
camelContext.getInjector().newInstance(routeClazz, false);
                         if (builder instanceof RoutesBuilder routesBuilder) {
                             routes.add(routesBuilder);
                         } else {
diff --git 
a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaRoutesBuilderLoader.java
 
b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaRoutesBuilderLoader.java
index bed3da758b0..d45ed2d6a40 100644
--- 
a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaRoutesBuilderLoader.java
+++ 
b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/JavaRoutesBuilderLoader.java
@@ -41,12 +41,14 @@ import org.apache.camel.language.joor.CamelJoorClassLoader;
 import org.apache.camel.language.joor.CompilationUnit;
 import org.apache.camel.language.joor.JavaJoorClassLoader;
 import org.apache.camel.language.joor.MultiCompile;
+import org.apache.camel.spi.CamelBeanPostProcessor;
 import org.apache.camel.spi.CompilePostProcessor;
 import org.apache.camel.spi.CompilePreProcessor;
 import org.apache.camel.spi.CompileStrategy;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.ResourceAware;
 import org.apache.camel.spi.annotations.RoutesLoader;
+import org.apache.camel.support.PluginHelper;
 import org.apache.camel.support.RouteWatcherReloadStrategy;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
@@ -66,6 +68,7 @@ public class JavaRoutesBuilderLoader extends 
ExtendedRouteBuilderLoaderSupport {
     private final ConcurrentMap<Collection<Resource>, CompilationUnit.Result> 
compiled = new ConcurrentHashMap<>();
     private final Map<String, Resource> nameToResource = new HashMap<>();
     private JavaJoorClassLoader classLoader;
+    private CamelBeanPostProcessor beanPostProcessor;
 
     public JavaRoutesBuilderLoader() {
         super(EXTENSION);
@@ -89,6 +92,7 @@ public class JavaRoutesBuilderLoader extends 
ExtendedRouteBuilderLoaderSupport {
             if (cs != null && cs.getWorkDir() != null) {
                 classLoader.setCompileDirectory(cs.getWorkDir());
             }
+            beanPostProcessor = PluginHelper.getBeanPostProcessor(context);
         }
     }
 
@@ -148,7 +152,7 @@ public class JavaRoutesBuilderLoader extends 
ExtendedRouteBuilderLoaderSupport {
                 if (ctr && !skip) {
                     // create a new instance of the class
                     try {
-                        obj = 
getCamelContext().getInjector().newInstance(clazz);
+                        obj = 
getCamelContext().getInjector().newInstance(clazz, false);
                         if (obj != null) {
                             LOG.debug("Compiled: {} -> {}", className, obj);
 
@@ -172,6 +176,11 @@ public class JavaRoutesBuilderLoader extends 
ExtendedRouteBuilderLoaderSupport {
             if (obj instanceof RouteBuilder) {
                 RouteBuilder builder = (RouteBuilder) obj;
                 answer.add(builder);
+            } else if (obj != null && beanPostProcessor != null) {
+                // we may have discovered pojo classes which we need to 
perform bean post-processing
+                // as they may have @BindToRegistry
+                beanPostProcessor.postProcessBeforeInitialization(obj, 
obj.getClass().getName());
+                beanPostProcessor.postProcessAfterInitialization(obj, 
obj.getClass().getName());
             }
         }
 
diff --git 
a/dsl/camel-java-joor-dsl/src/test/java/org/apache/camel/dsl/java/joor/JavaMultiCompileTest.java
 
b/dsl/camel-java-joor-dsl/src/test/java/org/apache/camel/dsl/java/joor/JavaMainIoCTest.java
similarity index 85%
copy from 
dsl/camel-java-joor-dsl/src/test/java/org/apache/camel/dsl/java/joor/JavaMultiCompileTest.java
copy to 
dsl/camel-java-joor-dsl/src/test/java/org/apache/camel/dsl/java/joor/JavaMainIoCTest.java
index d7b0003fd2c..c5d0f0afd6c 100644
--- 
a/dsl/camel-java-joor-dsl/src/test/java/org/apache/camel/dsl/java/joor/JavaMultiCompileTest.java
+++ 
b/dsl/camel-java-joor-dsl/src/test/java/org/apache/camel/dsl/java/joor/JavaMainIoCTest.java
@@ -18,18 +18,18 @@ package org.apache.camel.dsl.java.joor;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.main.Main;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-public class JavaMultiCompileTest {
+public class JavaMainIoCTest {
 
     @Test
-    public void testMainRoutesCollector() throws Exception {
-        // will load XML from target/classes when testing
+    public void testMainIoC() throws Exception {
         doTestMain(
-                "routes/MyBar*.java",
+                "routes/IoCWithBeanMethod.java",
                 null);
     }
 
@@ -43,8 +43,8 @@ public class JavaMultiCompileTest {
         assertNotNull(camelContext);
         assertEquals(1, camelContext.getRoutes().size());
 
-        String out = main.getCamelTemplate().requestBody("direct:start", 
"Jack", String.class);
-        assertEquals("Jack is at Moes Bar", out);
+        String out = main.getCamelTemplate().requestBody("direct:start", 
"World", String.class);
+        Assertions.assertEquals("Hello1", out);
 
         main.stop();
     }
diff --git 
a/dsl/camel-java-joor-dsl/src/test/java/org/apache/camel/dsl/java/joor/JavaMultiCompileTest.java
 
b/dsl/camel-java-joor-dsl/src/test/java/org/apache/camel/dsl/java/joor/JavaMultiCompileTest.java
index d7b0003fd2c..4d237429c15 100644
--- 
a/dsl/camel-java-joor-dsl/src/test/java/org/apache/camel/dsl/java/joor/JavaMultiCompileTest.java
+++ 
b/dsl/camel-java-joor-dsl/src/test/java/org/apache/camel/dsl/java/joor/JavaMultiCompileTest.java
@@ -46,6 +46,10 @@ public class JavaMultiCompileTest {
         String out = main.getCamelTemplate().requestBody("direct:start", 
"Jack", String.class);
         assertEquals("Jack is at Moes Bar", out);
 
+        Object b = 
main.getCamelContext().getRegistry().lookupByName("myBarEcho");
+        assertNotNull(b);
+        assertEquals("MyBarEcho1", b.toString());
+
         main.stop();
     }
 
diff --git a/dsl/camel-java-joor-dsl/src/test/resources/routes/MyBarEcho.java 
b/dsl/camel-java-joor-dsl/src/test/resources/routes/IoCWithBeanMethod.java
similarity index 68%
copy from dsl/camel-java-joor-dsl/src/test/resources/routes/MyBarEcho.java
copy to dsl/camel-java-joor-dsl/src/test/resources/routes/IoCWithBeanMethod.java
index 863cd6c8218..2a6620794e7 100644
--- a/dsl/camel-java-joor-dsl/src/test/resources/routes/MyBarEcho.java
+++ b/dsl/camel-java-joor-dsl/src/test/resources/routes/IoCWithBeanMethod.java
@@ -15,14 +15,21 @@
  * limitations under the License.
  */
 import org.apache.camel.BindToRegistry;
+import org.apache.camel.builder.RouteBuilder;
 
-@BindToRegistry("myBarEcho")
-public class MyBarEcho {
+public class IoCWithBeanMethod extends RouteBuilder {
 
-    private MyBar bar = new MyBar("Moes Bar");
+    private int counter;
 
-    public String echo(String s) {
-        return s + " is at " + bar.getName();
+    @Override
+    public void configure() throws Exception {
+        from("direct:start")
+            .setBody().simple("${bean:myIoC?method=toString}");
     }
 
+    @BindToRegistry("myIoC")
+    public String myEcho() {
+        counter++;
+        return "Hello" + counter;
+    }
 }
\ No newline at end of file
diff --git a/dsl/camel-java-joor-dsl/src/test/resources/routes/MyBarEcho.java 
b/dsl/camel-java-joor-dsl/src/test/resources/routes/MyBarEcho.java
index 863cd6c8218..b01eadda772 100644
--- a/dsl/camel-java-joor-dsl/src/test/resources/routes/MyBarEcho.java
+++ b/dsl/camel-java-joor-dsl/src/test/resources/routes/MyBarEcho.java
@@ -16,13 +16,29 @@
  */
 import org.apache.camel.BindToRegistry;
 
+import java.util.concurrent.atomic.AtomicInteger;
+
 @BindToRegistry("myBarEcho")
 public class MyBarEcho {
 
+    private static final AtomicInteger ctr = new AtomicInteger();
+
     private MyBar bar = new MyBar("Moes Bar");
 
+    public MyBarEcho() {
+        ctr.incrementAndGet();
+    }
+
     public String echo(String s) {
         return s + " is at " + bar.getName();
     }
 
+    public int getCounter() {
+        return ctr.get();
+    }
+
+    @Override
+    public String toString() {
+        return "MyBarEcho" + ctr.get();
+    }
 }
\ No newline at end of file

Reply via email to