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 0197e393818 CAMEL-22055: camel-main - Loaded Java routes may be
dependency injected twice (#18016)
0197e393818 is described below
commit 0197e39381844aca5bc35e70865f48d15cca4e7e
Author: Claus Ibsen <[email protected]>
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