You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/10/25 21:14:46 UTC

[camel] branch primary created (now f69417759f1)

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

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


      at f69417759f1 CAMEL-20048: findSingleByType should be consistent. Added mandatory variant and NoSuchBeanTypeException that better reflect this.

This branch includes the following new commits:

     new f69417759f1 CAMEL-20048: findSingleByType should be consistent. Added mandatory variant and NoSuchBeanTypeException that better reflect this.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[camel] 01/01: CAMEL-20048: findSingleByType should be consistent. Added mandatory variant and NoSuchBeanTypeException that better reflect this.

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f69417759f19e80c582a6d4063d97e8346526131
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Oct 25 23:13:22 2023 +0200

    CAMEL-20048: findSingleByType should be consistent. Added mandatory variant and NoSuchBeanTypeException that better reflect this.
---
 .../apache/camel/component/saga/SagaProducer.java  |  5 +-
 .../JavaDslTransactedNoTXManagerTest.java          |  4 +-
 .../java/org/apache/camel/NoSuchBeanException.java |  7 ++
 .../org/apache/camel/NoSuchBeanTypeException.java  | 32 ++++++++
 .../java/org/apache/camel/spi/BeanRepository.java  | 18 +++++
 .../impl/engine/CamelPostProcessorHelper.java      | 18 ++---
 .../camel/impl/engine/SimpleCamelContext.java      |  5 +-
 .../java/org/apache/camel/impl/DefaultModel.java   | 15 +---
 .../camel/reifier/AbstractPolicyReifier.java       | 86 +++++++++-------------
 .../java/org/apache/camel/reifier/LogReifier.java  | 15 +---
 .../java/org/apache/camel/reifier/SagaReifier.java |  8 +-
 .../org/apache/camel/util/EndpointHelperTest.java  |  2 +-
 .../apache/camel/support/CamelContextHelper.java   |  8 ++
 .../org/apache/camel/support/DefaultEndpoint.java  |  5 +-
 .../org/apache/camel/support/EndpointHelper.java   |  9 +--
 .../camel/support/LifecycleStrategySupport.java    |  6 +-
 .../camel/support/PropertyBindingSupport.java      | 25 +------
 17 files changed, 121 insertions(+), 147 deletions(-)

diff --git a/components/camel-saga/src/main/java/org/apache/camel/component/saga/SagaProducer.java b/components/camel-saga/src/main/java/org/apache/camel/component/saga/SagaProducer.java
index d03ef49ee5d..31ee7fc9515 100644
--- a/components/camel-saga/src/main/java/org/apache/camel/component/saga/SagaProducer.java
+++ b/components/camel-saga/src/main/java/org/apache/camel/component/saga/SagaProducer.java
@@ -37,10 +37,7 @@ public class SagaProducer extends DefaultAsyncProducer {
 
         CamelSagaService sagaService = endpoint.getCamelContext().hasService(CamelSagaService.class);
         if (sagaService == null) {
-            sagaService = CamelContextHelper.findSingleByType(endpoint.getCamelContext(), CamelSagaService.class);
-        }
-        if (sagaService == null) {
-            throw new IllegalStateException("Cannot find saga service: saga producers can only be used within a saga");
+            sagaService = CamelContextHelper.mandatoryFindSingleByType(endpoint.getCamelContext(), CamelSagaService.class);
         }
         this.camelSagaService = sagaService;
     }
diff --git a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/processor/JavaDslTransactedNoTXManagerTest.java b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/processor/JavaDslTransactedNoTXManagerTest.java
index 6d44c15c849..e0f9537f52c 100644
--- a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/processor/JavaDslTransactedNoTXManagerTest.java
+++ b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/processor/JavaDslTransactedNoTXManagerTest.java
@@ -44,7 +44,9 @@ public class JavaDslTransactedNoTXManagerTest extends ContextTestSupport {
             fail("Should have thrown an exception");
         } catch (Exception e) {
             NoSuchBeanException cause = assertIsInstanceOf(NoSuchBeanException.class, e.getCause());
-            assertEquals("No bean could be found in the registry of type: PlatformTransactionManager", cause.getMessage());
+            assertEquals(
+                    "No bean could be found in the registry for: org.springframework.transaction.PlatformTransactionManager",
+                    cause.getMessage());
         }
     }
 
diff --git a/core/camel-api/src/main/java/org/apache/camel/NoSuchBeanException.java b/core/camel-api/src/main/java/org/apache/camel/NoSuchBeanException.java
index 888668f1bcc..42bc3053d8d 100644
--- a/core/camel-api/src/main/java/org/apache/camel/NoSuchBeanException.java
+++ b/core/camel-api/src/main/java/org/apache/camel/NoSuchBeanException.java
@@ -28,6 +28,13 @@ public class NoSuchBeanException extends RuntimeCamelException {
         this.name = name;
     }
 
+    public NoSuchBeanException(String name, int size) {
+        super(size > 0
+                ? "Found " + size + " beans for: " + name + " in the registry, only 1 bean excepted."
+                : "No bean could be found in the registry for: " + name);
+        this.name = name;
+    }
+
     public NoSuchBeanException(String name, String type) {
         super("No bean could be found in the registry" + (name != null ? " for: " + name : "") + " of type: " + type);
         this.name = name;
diff --git a/core/camel-api/src/main/java/org/apache/camel/NoSuchBeanTypeException.java b/core/camel-api/src/main/java/org/apache/camel/NoSuchBeanTypeException.java
new file mode 100644
index 00000000000..cc791e98212
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/NoSuchBeanTypeException.java
@@ -0,0 +1,32 @@
+/*
+ * 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;
+
+/**
+ * A runtime exception if a given bean type could not be found in the {@link org.apache.camel.spi.Registry}
+ */
+public class NoSuchBeanTypeException extends NoSuchBeanException {
+
+    public NoSuchBeanTypeException(Class<?> type) {
+        super(type.getName());
+    }
+
+    public NoSuchBeanTypeException(Class<?> type, int size) {
+        super(type.getName(), size);
+    }
+
+}
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/BeanRepository.java b/core/camel-api/src/main/java/org/apache/camel/spi/BeanRepository.java
index 4f7e2ff32f7..fb875d2812f 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/BeanRepository.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/BeanRepository.java
@@ -19,6 +19,8 @@ package org.apache.camel.spi;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.camel.NoSuchBeanTypeException;
+
 /**
  * Represents a bean repository used to lookup components by name and type. This allows Camel to plugin to third-party
  * bean repositories such as Spring, JNDI, OSGi.
@@ -78,6 +80,22 @@ public interface BeanRepository {
         }
     }
 
+    /**
+     * Finds the bean by type, if there is exactly only one instance of the bean
+     *
+     * @param  type the type of the beans
+     * @return      the single bean instance, or throws {@link NoSuchBeanTypeException} if not exactly one bean was
+     *              found.
+     */
+    default <T> T mandatoryFindSingleByType(Class<T> type) {
+        Set<T> set = findByType(type);
+        if (set.size() == 1) {
+            return set.iterator().next();
+        } else {
+            throw new NoSuchBeanTypeException(type, set.size());
+        }
+    }
+
     /**
      * Strategy to wrap the value to be stored in the registry.
      *
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelPostProcessorHelper.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelPostProcessorHelper.java
index 18ac9934660..cfdfa6f5729 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelPostProcessorHelper.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelPostProcessorHelper.java
@@ -308,8 +308,8 @@ public class CamelPostProcessorHelper implements CamelContextAware {
             if (getCamelContext() != null && type.isAssignableFrom(getCamelContext().getClass())) {
                 return getCamelContext();
             }
-            Set<?> found = getCamelContext() != null ? getCamelContext().getRegistry().findByType(type) : null;
-            if (found == null || found.isEmpty()) {
+            Object found = getCamelContext() != null ? getCamelContext().getRegistry().findSingleByType(type) : null;
+            if (found == null) {
                 // this may be a common type so lets check this first
                 if (getCamelContext() != null && type.isAssignableFrom(Registry.class)) {
                     return getCamelContext().getRegistry();
@@ -338,12 +338,8 @@ public class CamelPostProcessorHelper implements CamelContextAware {
                     return answer;
                 }
                 throw new NoSuchBeanException(null, type.getName());
-            } else if (found.size() > 1) {
-                throw new NoSuchBeanException(
-                        "Found " + found.size() + " beans of type: " + type + ". Only one bean expected.");
             } else {
-                // we found only one
-                return found.iterator().next();
+                return found;
             }
         } else {
             return CamelContextHelper.mandatoryLookup(getCamelContext(), name, type);
@@ -367,12 +363,8 @@ public class CamelPostProcessorHelper implements CamelContextAware {
         // create an instance of type
         Object bean = null;
         if (map == null) {
-            Set<?> instances = ecc.getRegistry().findByType(type);
-            if (instances.size() == 1) {
-                bean = instances.iterator().next();
-            } else if (instances.size() > 1) {
-                return null;
-            } else {
+            bean = ecc.getRegistry().findSingleByType(type);
+            if (bean == null) {
                 // attempt to create a new instance
                 try {
                     bean = ecc.getInjector().newInstance(type);
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
index 49ca74f5a37..04bc7c475f0 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
@@ -619,10 +619,7 @@ public class SimpleCamelContext extends AbstractCamelContext {
         Tracer tracer = null;
         if (getRegistry() != null) {
             // lookup in registry
-            Map<String, Tracer> map = getRegistry().findByTypeWithName(Tracer.class);
-            if (map.size() == 1) {
-                tracer = map.values().iterator().next();
-            }
+            tracer = getRegistry().findSingleByType(Tracer.class);
         }
         if (tracer == null) {
             tracer = getCamelContextExtension().getContextPlugin(Tracer.class);
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
index 1ab011334be..e49e4f95459 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
@@ -22,7 +22,6 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.StringJoiner;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
@@ -31,7 +30,6 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.FailedToCreateRouteFromTemplateException;
-import org.apache.camel.NoSuchBeanException;
 import org.apache.camel.RouteTemplateContext;
 import org.apache.camel.model.BeanFactoryDefinition;
 import org.apache.camel.model.DataFormatDefinition;
@@ -701,16 +699,9 @@ public class DefaultModel implements Model {
         } else if (beanFactory.getType() != null && beanFactory.getType().startsWith("#type:")) {
             final CamelContext camelContext = routeTemplateContext.getCamelContext();
             Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(beanFactory.getType().substring(6));
-            Set<?> found = camelContext.getRegistry().findByType(clazz);
-            if (found == null || found.isEmpty()) {
-                throw new NoSuchBeanException(null, clazz.getName());
-            } else if (found.size() > 1) {
-                throw new NoSuchBeanException(
-                        "Found " + found.size() + " beans of type: " + clazz + ". Only one bean expected.");
-            } else {
-                // do not set properties when using #type as it uses an existing shared bean
-                routeTemplateContext.bind(beanFactory.getName(), clazz, found.iterator().next());
-            }
+            Object found = camelContext.getRegistry().mandatoryFindSingleByType(clazz);
+            // do not set properties when using #type as it uses an existing shared bean
+            routeTemplateContext.bind(beanFactory.getName(), clazz, found);
         } else {
             // invalid syntax for the local bean, so lets report an exception
             throw new IllegalArgumentException(
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractPolicyReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractPolicyReifier.java
index 1850949ab06..912e0c84d01 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractPolicyReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractPolicyReifier.java
@@ -17,10 +17,8 @@
 package org.apache.camel.reifier;
 
 import java.lang.reflect.Method;
-import java.util.Map;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.NoSuchBeanException;
 import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.ProcessorDefinition;
@@ -58,15 +56,10 @@ public abstract class AbstractPolicyReifier<T extends ProcessorDefinition<?>> ex
         // try to lookup by scoped type
         Policy answer = null;
         if (type != null) {
-            // try find by type, note that this method is not supported by all
-            // registry
-            Map<String, ?> types = findByTypeWithName(type);
-            if (types.size() == 1) {
-                // only one policy defined so use it
-                Object found = types.values().iterator().next();
-                if (type.isInstance(found)) {
-                    return type.cast(found);
-                }
+            // try find by type, note that this method is not supported by all registry
+            Policy found = findSingleByType(type);
+            if (found != null) {
+                return found;
             }
         }
 
@@ -85,51 +78,40 @@ public abstract class AbstractPolicyReifier<T extends ProcessorDefinition<?>> ex
             if (tmClazz != null) {
                 // see if we can find the platform transaction manager in the
                 // registry
-                Map<String, ?> maps = findByTypeWithName(tmClazz);
-                if (maps.size() == 1) {
-                    // only one platform manager then use it as default and
-                    // create a transacted
-                    // policy with it and default to required
+                Object transactionManager = mandatoryFindSingleByType(tmClazz);
+                // only one platform manager then use it as default and
+                // create a transacted
+                // policy with it and default to required
 
-                    // as we do not want dependency on spring jars in the
-                    // camel-core we use
-                    // reflection to lookup classes and create new objects and
-                    // call methods
-                    // as this is only done during route building it does not
-                    // matter that we
-                    // use reflection as performance is no a concern during
-                    // route building
-                    Object transactionManager = maps.values().iterator().next();
-                    LOG.debug("One instance of PlatformTransactionManager found in registry: {}", transactionManager);
-                    Class<?> txClazz = camelContext.getClassResolver()
-                            .resolveClass("org.apache.camel.spring.spi.SpringTransactionPolicy");
-                    if (txClazz != null) {
-                        LOG.debug("Creating a new temporary SpringTransactionPolicy using the PlatformTransactionManager: {}",
-                                transactionManager);
-                        TransactedPolicy txPolicy
-                                = org.apache.camel.support.ObjectHelper.newInstance(txClazz, TransactedPolicy.class);
-                        Method method;
-                        try {
-                            method = txClazz.getMethod("setTransactionManager", tmClazz);
-                        } catch (NoSuchMethodException e) {
-                            throw new RuntimeCamelException(
-                                    "Cannot get method setTransactionManager(PlatformTransactionManager) on class: " + txClazz);
-                        }
-                        org.apache.camel.support.ObjectHelper.invokeMethod(method, txPolicy, transactionManager);
-                        return txPolicy;
-                    } else {
-                        // camel-spring is missing on the classpath
+                // as we do not want dependency on spring jars in the
+                // camel-core we use
+                // reflection to lookup classes and create new objects and
+                // call methods
+                // as this is only done during route building it does not
+                // matter that we
+                // use reflection as performance is no a concern during
+                // route building
+                LOG.debug("One instance of PlatformTransactionManager found in registry: {}", transactionManager);
+                Class<?> txClazz = camelContext.getClassResolver()
+                        .resolveClass("org.apache.camel.spring.spi.SpringTransactionPolicy");
+                if (txClazz != null) {
+                    LOG.debug("Creating a new temporary SpringTransactionPolicy using the PlatformTransactionManager: {}",
+                            transactionManager);
+                    TransactedPolicy txPolicy
+                            = org.apache.camel.support.ObjectHelper.newInstance(txClazz, TransactedPolicy.class);
+                    Method method;
+                    try {
+                        method = txClazz.getMethod("setTransactionManager", tmClazz);
+                    } catch (NoSuchMethodException e) {
                         throw new RuntimeCamelException(
-                                "Cannot create a transacted policy as camel-spring.jar is not on the classpath!");
+                                "Cannot get method setTransactionManager(PlatformTransactionManager) on class: " + txClazz);
                     }
+                    org.apache.camel.support.ObjectHelper.invokeMethod(method, txPolicy, transactionManager);
+                    return txPolicy;
                 } else {
-                    if (maps.isEmpty()) {
-                        throw new NoSuchBeanException(null, "PlatformTransactionManager");
-                    } else {
-                        throw new IllegalArgumentException(
-                                "Found " + maps.size() + " PlatformTransactionManager in registry. "
-                                                           + "Cannot determine which one to use. Please configure a TransactionTemplate on the transacted policy.");
-                    }
+                    // camel-spring is missing on the classpath
+                    throw new RuntimeCamelException(
+                            "Cannot create a transacted policy as camel-spring.jar is not on the classpath!");
                 }
             }
         }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/LogReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/LogReifier.java
index cc46df36220..a1744b48135 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/LogReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/LogReifier.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.reifier;
 
-import java.util.Map;
-
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.LoggingLevel;
@@ -65,17 +63,8 @@ public class LogReifier extends ProcessorReifier<LogDefinition> {
         }
 
         if (logger == null) {
-            // first - try to lookup single instance in the registry, just like
-            // LogComponent
-            Map<String, Logger> availableLoggers = findByTypeWithName(Logger.class);
-            if (availableLoggers.size() == 1) {
-                logger = availableLoggers.values().iterator().next();
-                LOG.debug("Using custom Logger: {}", logger);
-            } else if (availableLoggers.size() > 1) {
-                // we should log about this somewhere...
-                LOG.debug("More than one {} instance found in the registry. Falling back to create logger by name.",
-                        Logger.class.getName());
-            }
+            // first - try to lookup single instance in the registry, just like LogComponent
+            logger = findSingleByType(Logger.class);
         }
 
         if (logger == null) {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SagaReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SagaReifier.java
index 2aefa602b47..4900658ae54 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SagaReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SagaReifier.java
@@ -102,13 +102,7 @@ public class SagaReifier extends ProcessorReifier<SagaDefinition> {
             return sagaService;
         }
 
-        sagaService = findSingleByType(CamelSagaService.class);
-        if (sagaService != null) {
-            return sagaService;
-        }
-
-        throw new IllegalArgumentException(
-                "Cannot find CamelSagaService in Registry");
+        return mandatoryFindSingleByType(CamelSagaService.class);
     }
 
 }
diff --git a/core/camel-core/src/test/java/org/apache/camel/util/EndpointHelperTest.java b/core/camel-core/src/test/java/org/apache/camel/util/EndpointHelperTest.java
index d11ba17b763..c22dd27ad6d 100644
--- a/core/camel-core/src/test/java/org/apache/camel/util/EndpointHelperTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/util/EndpointHelperTest.java
@@ -250,7 +250,7 @@ public class EndpointHelperTest extends ContextTestSupport {
                     AuthorizationPolicy.class);
             fail("Should throw exception");
         } catch (NoSuchBeanException e) {
-            assertTrue(e.getMessage().contains("Found 2 beans"));
+            // expected
         }
     }
 
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/CamelContextHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/CamelContextHelper.java
index 5a8ef88ef47..2f5a49a7093 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/CamelContextHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/CamelContextHelper.java
@@ -213,6 +213,14 @@ public final class CamelContextHelper {
         return camelContext.getRegistry().findSingleByType(type);
     }
 
+    /**
+     * Look up a bean of the give type in the {@link org.apache.camel.spi.Registry} on the {@link CamelContext} or
+     * throws {@link org.apache.camel.NoSuchBeanTypeException} if not a single bean was found.
+     */
+    public static <T> T mandatoryFindSingleByType(CamelContext camelContext, Class<T> type) {
+        return camelContext.getRegistry().mandatoryFindSingleByType(type);
+    }
+
     /**
      * Look up the given named bean in the {@link org.apache.camel.spi.Registry} on the {@link CamelContext} or throws
      * {@link NoSuchBeanException} if not found.
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultEndpoint.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultEndpoint.java
index dda837cc5e2..5cac9b3202c 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultEndpoint.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultEndpoint.java
@@ -507,10 +507,7 @@ public abstract class DefaultEndpoint extends ServiceSupport implements Endpoint
                         if (value == null) {
                             Class<?> type = getter.getOptionType(name, true);
                             if (type != null) {
-                                Set<?> set = camelContext.getRegistry().findByType(type);
-                                if (set.size() == 1) {
-                                    value = set.iterator().next();
-                                }
+                                value = camelContext.getRegistry().findSingleByType(type);
                             }
                             if (value != null) {
                                 boolean hit = configurer.configure(camelContext, this, name, value, true);
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 ae971a21714..f13cb037f01 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
@@ -22,7 +22,6 @@ import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.camel.CamelContext;
@@ -334,13 +333,7 @@ public final class EndpointHelper {
             try {
                 value = value.substring(6);
                 Class<?> clazz = context.getClassResolver().resolveMandatoryClass(value);
-                Set<?> set = context.getRegistry().findByType(clazz);
-                if (set.size() == 1) {
-                    answer = set.iterator().next();
-                } else if (set.size() > 1) {
-                    throw new NoSuchBeanException(
-                            value, "Found " + set.size() + " beans of type: " + clazz + ". Only 1 bean instance is supported.");
-                }
+                answer = context.getRegistry().mandatoryFindSingleByType(clazz);
             } catch (ClassNotFoundException e) {
                 throw new NoSuchBeanException(value, e);
             }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/LifecycleStrategySupport.java b/core/camel-support/src/main/java/org/apache/camel/support/LifecycleStrategySupport.java
index e43ed8318a1..61a6e384974 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/LifecycleStrategySupport.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/LifecycleStrategySupport.java
@@ -17,7 +17,6 @@
 package org.apache.camel.support;
 
 import java.util.Collection;
-import java.util.Set;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.function.Consumer;
 
@@ -258,10 +257,7 @@ public abstract class LifecycleStrategySupport implements LifecycleStrategy {
                     if (value == null) {
                         Class<?> type = getter.getOptionType(option, true);
                         if (type != null) {
-                            Set<?> set = camelContext.getRegistry().findByType(type);
-                            if (set.size() == 1) {
-                                value = set.iterator().next();
-                            }
+                            value = camelContext.getRegistry().findSingleByType(type);
                         }
                         if (value != null) {
                             boolean hit = pc.configure(camelContext, target, option, value, true);
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
index d93c9a845fd..7d766645ee1 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
@@ -855,18 +855,7 @@ public final class PropertyBindingSupport {
                     }
                 }
                 if (parameterType != null) {
-                    Set<?> types = context.getRegistry().findByType(parameterType);
-                    if (types.size() == 1) {
-                        value = types.iterator().next();
-                    } else if (types.size() > 1) {
-                        throw new IllegalStateException(
-                                "Cannot select single type: " + parameterType + " as there are " + types.size()
-                                                        + " beans in the registry with this type");
-                    } else {
-                        throw new IllegalStateException(
-                                "Cannot select single type: " + parameterType
-                                                        + " as there are no beans in the registry with this type");
-                    }
+                    value = context.getRegistry().mandatoryFindSingleByType(parameterType);
                 }
             }
         }
@@ -1611,17 +1600,7 @@ public final class PropertyBindingSupport {
             // its reference by type, so lookup the actual value and use it if there is only one instance in the registry
             String typeName = strval.substring(6);
             Class<?> type = camelContext.getClassResolver().resolveMandatoryClass(typeName);
-            Set<?> types = camelContext.getRegistry().findByType(type);
-            if (types.size() == 1) {
-                answer = types.iterator().next();
-            } else if (types.size() > 1) {
-                throw new IllegalStateException(
-                        "Cannot select single type: " + typeName + " as there are " + types.size()
-                                                + " beans in the registry with this type");
-            } else {
-                throw new IllegalStateException(
-                        "Cannot select single type: " + typeName + " as there are no beans in the registry with this type");
-            }
+            answer = camelContext.getRegistry().mandatoryFindSingleByType(type);
         } else if (strval.startsWith("#bean:")) {
             String key = strval.substring(6);
             answer = CamelContextHelper.mandatoryLookup(camelContext, key);