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