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

jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/main by this push:
     new 2b1936e116 Support resolving beans by name and qualifiers
2b1936e116 is described below

commit 2b1936e1161e1bd8adad5b9b1c16772b8cd53b20
Author: James Netherton <jamesnether...@gmail.com>
AuthorDate: Tue Jun 10 10:37:24 2025 +0100

    Support resolving beans by name and qualifiers
    
    Fixes #7426
---
 .../core/deployment/CamelRegistryProcessor.java    |   8 +-
 .../spi/CamelBeanQualifierResolverBuildItem.java   |  11 ++
 .../CamelRegistryBeanQualifierResolutionTest.java  |  82 ++++++--
 .../core/BeanQualifierResolverIdentifier.java      |  61 ++++++
 .../quarkus/core/CamelBeanQualifierResolver.java   |  32 +++-
 .../apache/camel/quarkus/core/CamelRecorder.java   |  15 +-
 .../camel/quarkus/core/RuntimeBeanRepository.java  | 206 +++++++++------------
 .../apache/camel/quarkus/core/RuntimeRegistry.java |   2 +-
 .../camel/quarkus/component/bean/BeanTest.java     |   3 +-
 9 files changed, 274 insertions(+), 146 deletions(-)

diff --git 
a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRegistryProcessor.java
 
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRegistryProcessor.java
index 9b08e7e97a..fe79533a77 100644
--- 
a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRegistryProcessor.java
+++ 
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRegistryProcessor.java
@@ -28,6 +28,7 @@ import io.quarkus.deployment.annotations.Record;
 import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
 import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
 import org.apache.camel.BindToRegistry;
+import org.apache.camel.quarkus.core.BeanQualifierResolverIdentifier;
 import org.apache.camel.quarkus.core.CamelBeanQualifierResolver;
 import org.apache.camel.quarkus.core.CamelCapabilities;
 import org.apache.camel.quarkus.core.CamelConfig;
@@ -61,9 +62,12 @@ public class CamelRegistryProcessor {
             List<CamelBeanQualifierResolverBuildItem> 
camelBeanQualifierResolvers,
             CamelRecorder recorder) {
 
-        Map<String, CamelBeanQualifierResolver> beanQualifierResolvers = new 
HashMap<>();
+        Map<BeanQualifierResolverIdentifier, CamelBeanQualifierResolver> 
beanQualifierResolvers = new HashMap<>();
         for (CamelBeanQualifierResolverBuildItem resolver : 
camelBeanQualifierResolvers) {
-            
recorder.registerCamelBeanQualifierResolver(resolver.getBeanTypeName(), 
resolver.getRuntimeValue(),
+            recorder.registerCamelBeanQualifierResolver(
+                    resolver.getBeanTypeName(),
+                    resolver.getBeanName(),
+                    resolver.getRuntimeValue(),
                     beanQualifierResolvers);
         }
 
diff --git 
a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/spi/CamelBeanQualifierResolverBuildItem.java
 
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/spi/CamelBeanQualifierResolverBuildItem.java
index 7d9e96b0b9..7a207f502e 100644
--- 
a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/spi/CamelBeanQualifierResolverBuildItem.java
+++ 
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/spi/CamelBeanQualifierResolverBuildItem.java
@@ -26,9 +26,16 @@ import 
org.apache.camel.quarkus.core.CamelBeanQualifierResolver;
 public final class CamelBeanQualifierResolverBuildItem extends MultiBuildItem {
     private final RuntimeValue<CamelBeanQualifierResolver> runtimeValue;
     private final Class<?> beanType;
+    private final String beanName;
 
     public CamelBeanQualifierResolverBuildItem(Class<?> beanType, 
RuntimeValue<CamelBeanQualifierResolver> runtimeValue) {
+        this(beanType, null, runtimeValue);
+    }
+
+    public CamelBeanQualifierResolverBuildItem(Class<?> beanType, String 
beanName,
+            RuntimeValue<CamelBeanQualifierResolver> runtimeValue) {
         this.beanType = beanType;
+        this.beanName = beanName;
         this.runtimeValue = runtimeValue;
     }
 
@@ -40,6 +47,10 @@ public final class CamelBeanQualifierResolverBuildItem 
extends MultiBuildItem {
         return beanType.getName();
     }
 
+    public String getBeanName() {
+        return beanName;
+    }
+
     public RuntimeValue<CamelBeanQualifierResolver> getRuntimeValue() {
         return runtimeValue;
     }
diff --git 
a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/deployment/CamelRegistryBeanQualifierResolutionTest.java
 
b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/deployment/CamelRegistryBeanQualifierResolutionTest.java
index ae67c3c91e..9aad114ab7 100644
--- 
a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/deployment/CamelRegistryBeanQualifierResolutionTest.java
+++ 
b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/deployment/CamelRegistryBeanQualifierResolutionTest.java
@@ -48,7 +48,8 @@ import static java.lang.annotation.ElementType.TYPE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 public class CamelRegistryBeanQualifierResolutionTest {
 
@@ -68,13 +69,25 @@ public class CamelRegistryBeanQualifierResolutionTest {
                                     Integer.toString(methodName.hashCode()),
                                     true, s -> null);
 
-                            RuntimeValue<CamelBeanQualifierResolver> 
runtimeValue = recorder
-                                    
.newInstance(TestBeanQualifierResolver.class.getName());
+                            RuntimeValue<CamelBeanQualifierResolver> 
runtimeValueFoo = recorder
+                                    
.newInstance(FooNamedBeanQualifierResolver.class.getName());
                             context.produce(new 
StaticBytecodeRecorderBuildItem(recorder));
 
-                            CamelBeanQualifierResolverBuildItem buildItem = 
new CamelBeanQualifierResolverBuildItem(Foo.class,
-                                    runtimeValue);
-                            context.produce(buildItem);
+                            CamelBeanQualifierResolverBuildItem buildItemFoo = 
new CamelBeanQualifierResolverBuildItem(
+                                    Foo.class,
+                                    "foo",
+                                    runtimeValueFoo);
+                            context.produce(buildItemFoo);
+
+                            RuntimeValue<CamelBeanQualifierResolver> 
runtimeValueBar = recorder
+                                    
.newInstance(BarNamedBeanQualifierResolver.class.getName());
+                            context.produce(new 
StaticBytecodeRecorderBuildItem(recorder));
+
+                            CamelBeanQualifierResolverBuildItem buildItemBar = 
new CamelBeanQualifierResolverBuildItem(
+                                    Bar.class,
+                                    "bar",
+                                    runtimeValueBar);
+                            context.produce(buildItemBar);
                         }
                     
}).produces(StaticBytecodeRecorderBuildItem.class).produces(CamelBeanQualifierResolverBuildItem.class)
                             .build();
@@ -87,27 +100,63 @@ public class CamelRegistryBeanQualifierResolutionTest {
 
     @Test
     public void testBeanLookupWithQualifiers() {
-        // Foo should be resolvable since we have a CamelBeanQualifierResolver 
for that type
+        // Foo & Bar should be resolvable since we have a 
CamelBeanQualifierResolver for those types
         Set<Foo> fooBeans = context.getRegistry().findByType(Foo.class);
         assertEquals(1, fooBeans.size());
 
-        // Bar should not be resolvable as there is no 
CamelBeanQualifierResolver for that type
+        Foo foo = context.getRegistry().lookupByNameAndType("foo", Foo.class);
+        assertNotNull(foo);
+
+        foo = context.getRegistry().findSingleByType(Foo.class);
+        assertNotNull(foo);
+
+        Bar bar = context.getRegistry().lookupByNameAndType("bar", Bar.class);
+        assertNotNull(bar);
+
+        // We don't care about qualifiers when doing findByType so we should 
find all Bar beans
         Set<Bar> barBeans = context.getRegistry().findByType(Bar.class);
-        assertTrue(barBeans.isEmpty());
+        assertEquals(2, barBeans.size());
+
+        // There are 2 beans so we can't find using findSingleByType
+        bar = context.getRegistry().findSingleByType(Bar.class);
+        assertNull(bar);
+
+        // Bar2 should not be resolvable as there is no 
CamelBeanQualifierResolver to help with its bean resolution
+        Bar bar2 = context.getRegistry().lookupByNameAndType("bar2", 
Bar.class);
+        assertNull(bar2);
     }
 
     @Qualifier
     @Retention(RUNTIME)
     @Target({ TYPE, METHOD })
     public @interface CamelQuarkusQualifier {
+        String value() default "";
+
         class CamelQuarkusLiteral extends 
AnnotationLiteral<CamelQuarkusQualifier> implements CamelQuarkusQualifier {
+            private final String value;
+
+            public CamelQuarkusLiteral(String value) {
+                this.value = value;
+            }
+
+            @Override
+            public String value() {
+                return this.value;
+            }
         }
     }
 
-    public static class TestBeanQualifierResolver implements 
CamelBeanQualifierResolver {
+    public static class FooNamedBeanQualifierResolver implements 
CamelBeanQualifierResolver {
         @Override
         public Annotation[] resolveQualifiers() {
-            return new Annotation[] { new 
CamelQuarkusQualifier.CamelQuarkusLiteral() };
+            return new Annotation[] { new 
CamelQuarkusQualifier.CamelQuarkusLiteral("foo") };
+        }
+    }
+
+    public static class BarNamedBeanQualifierResolver implements 
CamelBeanQualifierResolver {
+        @Override
+        public Annotation[] resolveQualifiers() {
+            return new Annotation[] { new 
CamelQuarkusQualifier.CamelQuarkusLiteral("bar") };
         }
     }
 
@@ -121,16 +170,23 @@ public class CamelRegistryBeanQualifierResolutionTest {
     public static class Service {
         @Unremovable
         @Produces
-        @CamelQuarkusQualifier
+        @CamelQuarkusQualifier("foo")
         public Foo foo() {
             return new Foo();
         }
 
         @Unremovable
         @Produces
-        @CamelQuarkusQualifier
+        @CamelQuarkusQualifier("bar")
         public Bar bar() {
             return new Bar();
         }
+
+        @Unremovable
+        @Produces
+        @CamelQuarkusQualifier("bar2")
+        public Bar bar2() {
+            return new Bar();
+        }
     }
 }
diff --git 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/BeanQualifierResolverIdentifier.java
 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/BeanQualifierResolverIdentifier.java
new file mode 100644
index 0000000000..890156b69f
--- /dev/null
+++ 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/BeanQualifierResolverIdentifier.java
@@ -0,0 +1,61 @@
+/*
+ * 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.quarkus.core;
+
+import java.util.Objects;
+
+public final class BeanQualifierResolverIdentifier {
+    private final String className;
+    private final String beanName;
+
+    BeanQualifierResolverIdentifier(String className, String beanName) {
+        this.className = className;
+        this.beanName = beanName;
+    }
+
+    public static BeanQualifierResolverIdentifier of(String className) {
+        return new BeanQualifierResolverIdentifier(className, null);
+    }
+
+    public static BeanQualifierResolverIdentifier of(String className, String 
beanName) {
+        return new BeanQualifierResolverIdentifier(className, beanName);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        BeanQualifierResolverIdentifier that = 
(BeanQualifierResolverIdentifier) o;
+        return Objects.equals(className, that.className) && 
Objects.equals(beanName, that.beanName);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(className, beanName);
+    }
+
+    @Override
+    public String toString() {
+        String result = "class name " + className;
+        if (beanName != null) {
+            result += ", bean name " + beanName;
+        }
+        return result;
+    }
+}
diff --git 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelBeanQualifierResolver.java
 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelBeanQualifierResolver.java
index c8d7cc5330..c554d622b9 100644
--- 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelBeanQualifierResolver.java
+++ 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelBeanQualifierResolver.java
@@ -19,8 +19,36 @@ package org.apache.camel.quarkus.core;
 import java.lang.annotation.Annotation;
 
 /**
- * Abstraction for resolving bean annotation qualifiers
+ * Abstraction for resolving bean annotation qualifiers.
  */
 public interface CamelBeanQualifierResolver {
-    Annotation[] resolveQualifiers();
+    /**
+     * Resolves bean annotation qualifiers.
+     *
+     * @return The resolved bean {@link Annotation} qualifiers
+     */
+    default Annotation[] resolveQualifiers() {
+        return null;
+    }
+
+    /**
+     * Resolves bean annotation qualifiers with the given bean name.
+     *
+     * @param  beanName The name of the bean
+     * @return          The resolved bean {@link Annotation} qualifiers
+     */
+    default Annotation[] resolveAnnotations(String beanName) {
+        return null;
+    }
+
+    /**
+     * Gets the {@link BeanQualifierResolverIdentifier} associated with this 
{@link CamelBeanQualifierResolver}.
+     *
+     * @param  className The class name of the bean
+     * @param  beanName  The name of the bean. Can be null
+     * @return           The {@link BeanQualifierResolverIdentifier}
+     */
+    default BeanQualifierResolverIdentifier getIdentifier(String className, 
String beanName) {
+        return BeanQualifierResolverIdentifier.of(className, beanName);
+    }
 }
diff --git 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
index 829e78d879..da994ce9e5 100644
--- 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
+++ 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
@@ -51,17 +51,22 @@ import 
org.apache.camel.support.startup.DefaultStartupStepRecorder;
 public class CamelRecorder {
     public void registerCamelBeanQualifierResolver(
             String className,
+            String beanName,
             RuntimeValue<CamelBeanQualifierResolver> runtimeValue,
-            Map<String, CamelBeanQualifierResolver> beanQualifiers) {
+            Map<BeanQualifierResolverIdentifier, CamelBeanQualifierResolver> 
beanQualifiers) {
 
-        if (beanQualifiers.containsKey(className)) {
-            throw new RuntimeException("Duplicate CamelBeanQualifierResolver 
detected for class: " + className);
+        CamelBeanQualifierResolver resolver = runtimeValue.getValue();
+        BeanQualifierResolverIdentifier identifier = 
resolver.getIdentifier(className, beanName);
+
+        if (beanQualifiers.containsKey(identifier)) {
+            throw new RuntimeException("Duplicate CamelBeanQualifierResolver 
detected for: " + identifier);
         }
 
-        beanQualifiers.put(className, runtimeValue.getValue());
+        beanQualifiers.put(identifier, resolver);
     }
 
-    public RuntimeValue<Registry> createRegistry(Map<String, 
CamelBeanQualifierResolver> beanQualifierResolvers) {
+    public RuntimeValue<Registry> createRegistry(
+            Map<BeanQualifierResolverIdentifier, CamelBeanQualifierResolver> 
beanQualifierResolvers) {
         return new RuntimeValue<>(new RuntimeRegistry(beanQualifierResolvers));
     }
 
diff --git 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java
 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java
index 6eb36869b0..6ecb21dedc 100644
--- 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java
+++ 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java
@@ -18,9 +18,7 @@ package org.apache.camel.quarkus.core;
 
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -32,107 +30,19 @@ import io.quarkus.arc.ArcContainer;
 import io.quarkus.arc.InjectableBean;
 import io.quarkus.arc.InstanceHandle;
 import io.smallrye.common.annotation.Identifier;
-import jakarta.enterprise.inject.AmbiguousResolutionException;
 import jakarta.enterprise.inject.Default;
 import jakarta.enterprise.inject.literal.NamedLiteral;
-import jakarta.enterprise.inject.spi.Bean;
 import jakarta.enterprise.inject.spi.BeanManager;
 import org.apache.camel.spi.BeanRepository;
 
 public final class RuntimeBeanRepository implements BeanRepository {
+    private static final Annotation[] EMPTY_ANNOTATIONS = new Annotation[0];
+    private final Map<BeanQualifierResolverIdentifier, 
CamelBeanQualifierResolver> beanQualifierResolvers;
 
-    private final Map<String, CamelBeanQualifierResolver> 
beanQualifierResolvers;
-
-    public RuntimeBeanRepository(Map<String, CamelBeanQualifierResolver> 
beanQualifierResolvers) {
+    public RuntimeBeanRepository(Map<BeanQualifierResolverIdentifier, 
CamelBeanQualifierResolver> beanQualifierResolvers) {
         this.beanQualifierResolvers = beanQualifierResolvers;
     }
 
-    private static <T> Set<Bean<? extends T>> resolveAmbiguity(BeanManager 
manager, Set<Bean<? extends T>> beans) {
-        if (beans.size() > 1) {
-            try {
-                return Collections.singleton(manager.resolve(beans));
-            } catch (AmbiguousResolutionException are) {
-                //in case of AmbiguousResolutionException, original collection 
is returned
-            }
-        }
-
-        return beans;
-    }
-
-    private static <T> Map<String, T> getReferencesByTypeWithName(Class<T> 
type, Annotation... qualifiers) {
-        return getBeanManager()
-                .map(manager -> getReferencesByTypeWithName(manager, type, 
qualifiers))
-                .orElseGet(Collections::emptyMap);
-    }
-
-    private static <T> Set<T> getReferencesByType(BeanManager manager, 
Class<T> type, Annotation... qualifiers) {
-        Set<T> answer = new HashSet<>();
-
-        for (Bean<?> bean : resolveAmbiguity(manager, manager.getBeans(type, 
qualifiers))) {
-            T ref = getReference(manager, type, bean);
-            if (ref != null) {
-                answer.add(ref);
-            }
-        }
-
-        return answer;
-    }
-
-    private static <T> Optional<T> getReferenceByName(BeanManager manager, 
String name, Class<T> type) {
-        Set<Bean<?>> beans = manager.getBeans(name);
-
-        // If it is a Synthetic bean, it should match with type
-        beans = beans.stream()
-                .filter(bean -> {
-                    if (bean instanceof InjectableBean injectableBean) {
-                        return 
!injectableBean.getKind().equals(InjectableBean.Kind.SYNTHETIC)
-                                || bean.getTypes().contains(type);
-                    } else {
-                        return true;
-                    }
-                }).collect(Collectors.toSet());
-
-        if (beans.isEmpty()) {
-            // Fallback to searching explicitly with NamedLiteral
-            beans = manager.getBeans(type, NamedLiteral.of(name));
-        }
-
-        if (beans.isEmpty()) {
-            // Fallback to SmallRye @Identifier
-            beans = manager.getBeans(type, Identifier.Literal.of(name));
-        }
-
-        return Optional.ofNullable(manager.resolve(beans)).map(bean -> 
getReference(manager, type, bean));
-    }
-
-    private static <T> T getReference(BeanManager manager, Class<T> type, 
Bean<?> bean) {
-        return type.cast(manager.getReference(bean, Object.class, 
manager.createCreationalContext(bean)));
-    }
-
-    private static <T> Map<String, T> getReferencesByTypeWithName(BeanManager 
manager, Class<T> type,
-            Annotation... qualifiers) {
-        Map<String, T> answer = new HashMap<>();
-
-        for (Bean<?> bean : manager.getBeans(type, qualifiers)) {
-
-            T ref = getReference(manager, type, bean);
-            if (ref != null) {
-                answer.put(bean.getName(), ref);
-            }
-        }
-
-        return answer;
-    }
-
-    private static Optional<BeanManager> getBeanManager() {
-        ArcContainer container = Arc.container();
-        if (container == null) {
-            return Optional.empty();
-        }
-
-        return Optional.ofNullable(container.beanManager());
-    }
-
     @Override
     public Object lookupByName(String name) {
         return lookupByNameAndType(name, Object.class);
@@ -141,43 +51,28 @@ public final class RuntimeBeanRepository implements 
BeanRepository {
     @Override
     public <T> T lookupByNameAndType(String name, Class<T> type) {
         return getBeanManager()
-                .flatMap(manager -> getReferenceByName(manager, name, type))
+                .flatMap(manager -> getReferenceByName(name, type, 
resolveQualifiersForTypeAndName(type, name)))
                 .orElse(null);
     }
 
     @Override
     public <T> Map<String, T> findByTypeWithName(Class<T> type) {
-        Optional<Annotation[]> qualifiers = resolveQualifiersForType(type);
-        if (qualifiers.isPresent()) {
-            return getReferencesByTypeWithName(type, qualifiers.get());
-        }
-        return getReferencesByTypeWithName(type);
+        return getReferencesByTypeWithName(type, 
resolveQualifiersForType(type));
     }
 
     @Override
     public <T> Set<T> findByType(Class<T> type) {
-        Optional<Annotation[]> qualifiers = resolveQualifiersForType(type);
-        if (qualifiers.isPresent()) {
-            return getBeanManager()
-                    .map(manager -> getReferencesByType(manager, type, 
qualifiers.get()))
-                    .orElseGet(Collections::emptySet);
-        }
-        return getBeanManager()
-                .map(manager -> getReferencesByType(manager, type))
-                .orElseGet(Collections::emptySet);
+        return Arc.container()
+                .listAll(type)
+                .stream()
+                .filter(InstanceHandle::isAvailable)
+                .map(InstanceHandle::get)
+                .collect(Collectors.toSet());
     }
 
     @Override
     public <T> T findSingleByType(Class<T> type) {
-        ArcContainer container = Arc.container();
-        Optional<Annotation[]> qualifiers = resolveQualifiersForType(type);
-        List<InstanceHandle<T>> handles;
-        if (qualifiers.isPresent()) {
-            handles = container.listAll(type, qualifiers.get());
-        } else {
-            handles = container.listAll(type);
-        }
-
+        List<InstanceHandle<T>> handles = Arc.container().listAll(type, 
resolveQualifiersForType(type));
         if (handles.isEmpty()) {
             // No matches for the given bean type
             return null;
@@ -226,12 +121,81 @@ public final class RuntimeBeanRepository implements 
BeanRepository {
         return null;
     }
 
-    private Optional<Annotation[]> resolveQualifiersForType(Class<?> type) {
-        CamelBeanQualifierResolver resolver = 
beanQualifierResolvers.get(type.getName());
+    private static <T> Map<String, T> getReferencesByTypeWithName(Class<T> 
type, Annotation... qualifiers) {
+        Map<String, T> beans = new HashMap<>();
+        Arc.container()
+                .listAll(type, qualifiers)
+                .stream()
+                .filter(InstanceHandle::isAvailable)
+                .forEach(instanceHandle -> {
+                    beans.put(instanceHandle.getBean().getName(), 
instanceHandle.get());
+                });
+        return beans;
+    }
+
+    private static <T> Optional<T> getReferenceByName(String name, Class<T> 
type, Annotation... qualifiers) {
+        InstanceHandle<T> instance;
+        T result = null;
+
+        if (qualifiers.length == 0) {
+            // Try to resolve directly by name
+            instance = Arc.container().instance(name);
+        } else {
+            // If there are qualifiers then one of their attributes may 
represent the name we want to resolve
+            instance = Arc.container().instance(type, qualifiers);
+        }
+
+        if (instance.isAvailable()) {
+            // If it is a Synthetic bean, it must match with the desired type
+            InjectableBean<T> bean = instance.getBean();
+            if (bean.getKind().equals(InjectableBean.Kind.SYNTHETIC)) {
+                if (bean.getTypes().contains(type)) {
+                    result = instance.get();
+                }
+            } else {
+                result = instance.get();
+            }
+        }
+
+        if (result == null) {
+            // Fallback to searching explicitly with NamedLiteral
+            instance = Arc.container().instance(type, NamedLiteral.of(name));
+            if (instance.isAvailable()) {
+                result = instance.get();
+            }
+        }
+
+        if (result == null) {
+            // Fallback to SmallRye @Identifier
+            instance = Arc.container().instance(type, 
Identifier.Literal.of(name));
+            if (instance.isAvailable()) {
+                result = instance.get();
+            }
+        }
+
+        return Optional.ofNullable(result);
+    }
+
+    private static Optional<BeanManager> getBeanManager() {
+        ArcContainer container = Arc.container();
+        if (container == null) {
+            return Optional.empty();
+        }
+
+        return Optional.ofNullable(container.beanManager());
+    }
+
+    private Annotation[] resolveQualifiersForType(Class<?> type) {
+        return resolveQualifiersForTypeAndName(type, null);
+    }
+
+    private Annotation[] resolveQualifiersForTypeAndName(Class<?> type, String 
beanName) {
+        BeanQualifierResolverIdentifier identifier = 
BeanQualifierResolverIdentifier.of(type.getName(), beanName);
+        CamelBeanQualifierResolver resolver = 
beanQualifierResolvers.get(identifier);
         if (resolver != null) {
-            return Optional.ofNullable(resolver.resolveQualifiers());
+            return resolver.resolveQualifiers();
         }
-        return Optional.empty();
+        return EMPTY_ANNOTATIONS;
     }
 
     private boolean isDefaultBean(InjectableBean<?> bean) {
diff --git 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
index 3f547bd290..539581e459 100644
--- 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
+++ 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
@@ -22,7 +22,7 @@ import io.quarkus.runtime.RuntimeValue;
 import org.apache.camel.support.DefaultRegistry;
 
 public class RuntimeRegistry extends DefaultRegistry {
-    public RuntimeRegistry(Map<String, CamelBeanQualifierResolver> 
beanQualifierResolvers) {
+    public RuntimeRegistry(Map<BeanQualifierResolverIdentifier, 
CamelBeanQualifierResolver> beanQualifierResolvers) {
         super(new RuntimeBeanRepository(beanQualifierResolvers));
     }
 
diff --git 
a/integration-test-groups/foundation/bean/src/test/java/org/apache/camel/quarkus/component/bean/BeanTest.java
 
b/integration-test-groups/foundation/bean/src/test/java/org/apache/camel/quarkus/component/bean/BeanTest.java
index a3a41fe7f1..24c72f63f1 100644
--- 
a/integration-test-groups/foundation/bean/src/test/java/org/apache/camel/quarkus/component/bean/BeanTest.java
+++ 
b/integration-test-groups/foundation/bean/src/test/java/org/apache/camel/quarkus/component/bean/BeanTest.java
@@ -246,9 +246,8 @@ public class BeanTest {
         RestAssured.given()
                 .get("/bean/allBeanInstances")
                 .then()
-                .body("size()", is(5))
+                .body("size()", is(4))
                 .body(allOf(
-                        containsString("defaultBean"),
                         containsString("overridingBean"),
                         containsString("bean1"),
                         containsString("bean2"),

Reply via email to