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

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

commit dc469462a8bfda9a61ff8298129418ec302e3c90
Author: Claus Ibsen <[email protected]>
AuthorDate: Sun Feb 15 16:38:07 2026 +0100

    CAMEL-23008: camel-jbang - Transform route that refers to beans via #class 
should be possible
---
 .../docs/modules/eips/pages/multicast-eip.adoc     |  1 +
 .../org/apache/camel/reifier/AbstractReifier.java  | 18 ++++--
 .../org/apache/camel/support/EndpointHelper.java   |  9 ++-
 .../apache/camel/main/stub/BeanStubReifier.java    | 66 ---------------------
 ...KameletStubReifier.java => StubEipReifier.java} | 67 +++++++++++++++++++---
 .../java/org/apache/camel/main/KameletMain.java    | 10 +---
 .../camel/dsl/yaml/validator/CamelYamlParser.java  | 11 ++--
 7 files changed, 90 insertions(+), 92 deletions(-)

diff --git 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
index e80eb6ac65f0..851eab8702d0 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
@@ -61,6 +61,7 @@ XML::
 ----
 
 YAML::
++
 [source,yaml]
 ----
 - route:
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
index f76ca5a68488..802b60040a53 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
@@ -187,11 +187,15 @@ public abstract class AbstractReifier implements 
BeanRepository {
         }
         name = parseString(name);
 
+        Object answer = null;
         if (EndpointHelper.isReferenceParameter(name)) {
-            return EndpointHelper.resolveReferenceParameter(camelContext, 
name, Object.class, false);
-        } else {
+            answer = EndpointHelper.resolveReferenceParameter(camelContext, 
name, Object.class, false);
+        }
+        if (answer == null) {
+            // fallback to use registry which allows tooling to influence 
reifier that uses beans or classes
             return getRegistry().lookupByName(name);
         }
+        return answer;
     }
 
     public <T> T lookupByNameAndType(String name, Class<T> type) {
@@ -200,11 +204,15 @@ public abstract class AbstractReifier implements 
BeanRepository {
         }
         name = parseString(name);
 
+        T answer = null;
         if (EndpointHelper.isReferenceParameter(name)) {
-            return EndpointHelper.resolveReferenceParameter(camelContext, 
name, type, false);
-        } else {
-            return getRegistry().lookupByNameAndType(name, type);
+            answer = EndpointHelper.resolveReferenceParameter(camelContext, 
name, type, false);
+        }
+        if (answer == null) {
+            // fallback to use registry which allows tooling to influence 
reifier that uses beans or classes
+            answer = getRegistry().lookupByNameAndType(name, type);
         }
+        return answer;
     }
 
     @Override
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java 
b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
index e061826597a8..284eee27cf5b 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
@@ -413,7 +413,7 @@ public final class EndpointHelper {
             factoryMethod = StringHelper.after(className, "#");
             className = StringHelper.before(className, "#");
         }
-        Class<?> clazz = 
camelContext.getClassResolver().resolveMandatoryClass(className);
+        Class<?> clazz = 
camelContext.getClassResolver().resolveClass(className);
         Class<?> factoryClass = null;
         if (factoryMethod != null) {
             String typeOrRef = StringHelper.before(factoryMethod, ":");
@@ -425,11 +425,16 @@ public final class EndpointHelper {
                 if (existing != null) {
                     factoryClass = existing.getClass();
                 } else {
-                    factoryClass = 
camelContext.getClassResolver().resolveMandatoryClass(typeOrRef);
+                    factoryClass = 
camelContext.getClassResolver().resolveClass(typeOrRef);
                 }
             }
         }
 
+        if (clazz == null && factoryClass == null) {
+            // cannot create bean from class
+            return null;
+        }
+
         if (factoryMethod != null && parameters != null) {
             Class<?> target = factoryClass != null ? factoryClass : clazz;
             answer = 
PropertyBindingSupport.newInstanceFactoryParameters(camelContext, target, 
factoryMethod, parameters);
diff --git 
a/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/BeanStubReifier.java
 
b/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/BeanStubReifier.java
deleted file mode 100644
index b8935aacb2b4..000000000000
--- 
a/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/BeanStubReifier.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.main.stub;
-
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.Processor;
-import org.apache.camel.builder.ExpressionBuilder;
-import org.apache.camel.builder.PredicateBuilder;
-import org.apache.camel.model.BeanDefinition;
-import org.apache.camel.model.language.MethodCallExpression;
-import org.apache.camel.processor.DisabledProcessor;
-import org.apache.camel.reifier.ProcessorReifier;
-import org.apache.camel.reifier.language.ExpressionReifier;
-
-public class BeanStubReifier {
-
-    private BeanStubReifier() {
-    }
-
-    public static void registerStubBeanReifiers() {
-        ExpressionReifier.registerReifier(MethodCallExpression.class, 
(camelContext, expressionDefinition) -> {
-            if (expressionDefinition instanceof MethodCallExpression) {
-                return new ExpressionReifier<>(camelContext, 
expressionDefinition) {
-                    @Override
-                    public Expression createExpression() {
-                        return ExpressionBuilder.constantExpression(null);
-                    }
-
-                    @Override
-                    public Predicate createPredicate() {
-                        return PredicateBuilder.constant(true);
-                    }
-                };
-            }
-            return null;
-        });
-        ProcessorReifier.registerReifier(BeanDefinition.class,
-                (route, processorDefinition) -> {
-                    if (processorDefinition instanceof BeanDefinition bd) {
-                        return new ProcessorReifier<>(route, bd) {
-                            @Override
-                            public Processor createProcessor() throws 
Exception {
-                                return new DisabledProcessor();
-                            }
-                        };
-                    }
-                    return null;
-                });
-    }
-
-}
diff --git 
a/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/KameletStubReifier.java
 
b/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/StubEipReifier.java
similarity index 50%
rename from 
dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/KameletStubReifier.java
rename to 
dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/StubEipReifier.java
index a918c36dc53b..5383cc71c261 100644
--- 
a/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/KameletStubReifier.java
+++ 
b/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/StubEipReifier.java
@@ -17,21 +17,76 @@
 package org.apache.camel.main.stub;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
 import org.apache.camel.NamedNode;
+import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
+import org.apache.camel.builder.ExpressionBuilder;
+import org.apache.camel.builder.PredicateBuilder;
+import org.apache.camel.model.BeanDefinition;
 import org.apache.camel.model.KameletDefinition;
+import org.apache.camel.model.ThrowExceptionDefinition;
+import org.apache.camel.model.language.MethodCallExpression;
 import org.apache.camel.processor.DisabledProcessor;
 import org.apache.camel.reifier.ProcessorReifier;
+import org.apache.camel.reifier.language.ExpressionReifier;
 import org.apache.camel.spi.ProcessorFactory;
 import org.apache.camel.support.PluginHelper;
 
-public class KameletStubReifier {
+public class StubEipReifier {
 
-    private KameletStubReifier() {
+    private StubEipReifier() {
     }
 
-    public static void registerStubKameletReifiers(CamelContext context) {
+    public static void registerStubEipReifiers(final CamelContext 
camelContext) {
+
+        // bean language (method call) refers to custom classes which we don't 
want to load or require being on classpath
+        ExpressionReifier.registerReifier(MethodCallExpression.class, 
(context, expressionDefinition) -> {
+            if (expressionDefinition instanceof MethodCallExpression) {
+                return new ExpressionReifier<>(camelContext, 
expressionDefinition) {
+                    @Override
+                    public Expression createExpression() {
+                        return ExpressionBuilder.constantExpression(null);
+                    }
+
+                    @Override
+                    public Predicate createPredicate() {
+                        return PredicateBuilder.constant(true);
+                    }
+                };
+            }
+            return null;
+        });
+        ProcessorReifier.registerReifier(BeanDefinition.class,
+                // bean refers to custom classes which we don't want to load 
or require being on classpath
+                (route, processorDefinition) -> {
+                    if (processorDefinition instanceof BeanDefinition bd) {
+                        return new ProcessorReifier<>(route, bd) {
+                            @Override
+                            public Processor createProcessor() throws 
Exception {
+                                return new DisabledProcessor();
+                            }
+                        };
+                    }
+                    return null;
+                });
+
+        ProcessorReifier.registerReifier(ThrowExceptionDefinition.class,
+                // throw exception to custom classes which we don't want to 
load or require being on classpath
+                (route, processorDefinition) -> {
+                    if (processorDefinition instanceof 
ThrowExceptionDefinition td) {
+                        return new ProcessorReifier<>(route, td) {
+                            @Override
+                            public Processor createProcessor() throws 
Exception {
+                                return new DisabledProcessor();
+                            }
+                        };
+                    }
+                    return null;
+                });
+
+        // kamelet EIP should be stubbed
         ProcessorReifier.registerReifier(KameletDefinition.class,
                 (route, processorDefinition) -> {
                     if (processorDefinition instanceof KameletDefinition kd) {
@@ -44,10 +99,9 @@ public class KameletStubReifier {
                     }
                     return null;
                 });
-
         // stub kamelet process factory also
-        final ProcessorFactory fac = PluginHelper.getProcessorFactory(context);
-        
context.getCamelContextExtension().addContextPlugin(ProcessorFactory.class, new 
ProcessorFactory() {
+        final ProcessorFactory fac = 
PluginHelper.getProcessorFactory(camelContext);
+        
camelContext.getCamelContextExtension().addContextPlugin(ProcessorFactory.class,
 new ProcessorFactory() {
             @Override
             public Processor createChildProcessor(Route route, NamedNode 
definition, boolean mandatory) throws Exception {
                 if (definition instanceof KameletDefinition) {
@@ -72,7 +126,6 @@ public class KameletStubReifier {
                 return fac.createProcessor(camelContext, definitionName, args);
             }
         });
-
     }
 
 }
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index ffb188b9e754..44cea83adbe6 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -27,6 +27,7 @@ import java.util.Optional;
 import java.util.TreeMap;
 import java.util.stream.Stream;
 
+import org.apache.camel.main.stub.StubEipReifier;
 import org.w3c.dom.Document;
 
 import org.apache.camel.CamelContext;
@@ -78,8 +79,6 @@ import org.apache.camel.main.download.TransactedDownloader;
 import org.apache.camel.main.download.TypeConverterLoaderDownloadListener;
 import org.apache.camel.main.injection.AnnotationDependencyInjection;
 import org.apache.camel.main.reload.OpenApiGeneratorReloadStrategy;
-import org.apache.camel.main.stub.BeanStubReifier;
-import org.apache.camel.main.stub.KameletStubReifier;
 import org.apache.camel.main.stub.StubBeanRepository;
 import org.apache.camel.main.util.ClipboardReloadStrategy;
 import org.apache.camel.main.util.ExtraClassesClassLoader;
@@ -492,11 +491,8 @@ public class KameletMain extends MainCommandLineSupport {
             // turn off inlining routes
             configure().rest().withInlineRoutes(false);
             blueprintXmlBeansHandler.setTransform(true);
-            // stub beans
-            BeanStubReifier.registerStubBeanReifiers();
-            // stub kamelet EIP
-            KameletStubReifier.registerStubKameletReifiers(answer);
-            // stub languages
+            // stub EIPs
+            StubEipReifier.registerStubEipReifiers(answer);
         }
         if (silent) {
             // silent should not include http server
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
index de355b21ef70..43b3abefa64e 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
@@ -26,10 +26,9 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.component.stub.StubComponent;
 import org.apache.camel.dsl.yaml.YamlRoutesBuilderLoader;
 import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.main.stub.BeanStubReifier;
-import org.apache.camel.main.stub.KameletStubReifier;
 import org.apache.camel.main.stub.StubBeanRepository;
 import org.apache.camel.main.stub.StubDataFormat;
+import org.apache.camel.main.stub.StubEipReifier;
 import org.apache.camel.main.stub.StubLanguage;
 import org.apache.camel.main.stub.StubTransformer;
 import org.apache.camel.spi.ComponentResolver;
@@ -64,11 +63,13 @@ public class CamelYamlParser {
                     (name, context) -> new StubLanguage());
             
camelContext.getCamelContextExtension().addContextPlugin(TransformerResolver.class,
                     (name, context) -> new StubTransformer());
-            camelContext.start();
+            // stub EIPs
+            StubEipReifier.registerStubEipReifiers(camelContext);
 
-            BeanStubReifier.registerStubBeanReifiers();
-            KameletStubReifier.registerStubKameletReifiers(camelContext);
+            // start camel
+            camelContext.start();
 
+            // load yaml to validate
             try (YamlRoutesBuilderLoader loader = new 
YamlRoutesBuilderLoader()) {
                 loader.setCamelContext(camelContext);
                 loader.start();

Reply via email to