Search in sources :

Example 6 with NoUniqueBeanDefinitionException

use of org.springframework.beans.factory.NoUniqueBeanDefinitionException in project spring-framework by spring-projects.

the class BeanFactoryAnnotationUtils method qualifiedBeanOfType.

/**
	 * Obtain a bean of type {@code T} from the given {@code BeanFactory} declaring a qualifier
	 * (e.g. {@code <qualifier>} or {@code @Qualifier}) matching the given qualifier).
	 * @param bf the BeanFactory to get the target bean from
	 * @param beanType the type of bean to retrieve
	 * @param qualifier the qualifier for selecting between multiple bean matches
	 * @return the matching bean of type {@code T} (never {@code null})
	 */
private static <T> T qualifiedBeanOfType(ConfigurableListableBeanFactory bf, Class<T> beanType, String qualifier) {
    String[] candidateBeans = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(bf, beanType);
    String matchingBean = null;
    for (String beanName : candidateBeans) {
        if (isQualifierMatch(qualifier::equals, beanName, bf)) {
            if (matchingBean != null) {
                throw new NoUniqueBeanDefinitionException(beanType, matchingBean, beanName);
            }
            matchingBean = beanName;
        }
    }
    if (matchingBean != null) {
        return bf.getBean(matchingBean, beanType);
    } else if (bf.containsBean(qualifier)) {
        // Fallback: target bean at least found by bean name - probably a manually registered singleton.
        return bf.getBean(qualifier, beanType);
    } else {
        throw new NoSuchBeanDefinitionException(qualifier, "No matching " + beanType.getSimpleName() + " bean found for qualifier '" + qualifier + "' - neither qualifier match nor bean name match!");
    }
}
Also used : NoSuchBeanDefinitionException(org.springframework.beans.factory.NoSuchBeanDefinitionException) NoUniqueBeanDefinitionException(org.springframework.beans.factory.NoUniqueBeanDefinitionException)

Example 7 with NoUniqueBeanDefinitionException

use of org.springframework.beans.factory.NoUniqueBeanDefinitionException in project spring-framework by spring-projects.

the class DefaultListableBeanFactory method resolveNamedBean.

@SuppressWarnings("unchecked")
private <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType, Object... args) throws BeansException {
    Assert.notNull(requiredType, "Required type must not be null");
    String[] candidateNames = getBeanNamesForType(requiredType);
    if (candidateNames.length > 1) {
        List<String> autowireCandidates = new ArrayList<>(candidateNames.length);
        for (String beanName : candidateNames) {
            if (!containsBeanDefinition(beanName) || getBeanDefinition(beanName).isAutowireCandidate()) {
                autowireCandidates.add(beanName);
            }
        }
        if (!autowireCandidates.isEmpty()) {
            candidateNames = autowireCandidates.toArray(new String[autowireCandidates.size()]);
        }
    }
    if (candidateNames.length == 1) {
        String beanName = candidateNames[0];
        return new NamedBeanHolder<>(beanName, getBean(beanName, requiredType, args));
    } else if (candidateNames.length > 1) {
        Map<String, Object> candidates = new LinkedHashMap<>(candidateNames.length);
        for (String beanName : candidateNames) {
            if (containsSingleton(beanName)) {
                candidates.put(beanName, getBean(beanName, requiredType, args));
            } else {
                candidates.put(beanName, getType(beanName));
            }
        }
        String candidateName = determinePrimaryCandidate(candidates, requiredType);
        if (candidateName == null) {
            candidateName = determineHighestPriorityCandidate(candidates, requiredType);
        }
        if (candidateName != null) {
            Object beanInstance = candidates.get(candidateName);
            if (beanInstance instanceof Class) {
                beanInstance = getBean(candidateName, requiredType, args);
            }
            return new NamedBeanHolder<>(candidateName, (T) beanInstance);
        }
        throw new NoUniqueBeanDefinitionException(requiredType, candidates.keySet());
    }
    return null;
}
Also used : NamedBeanHolder(org.springframework.beans.factory.config.NamedBeanHolder) ArrayList(java.util.ArrayList) Map(java.util.Map) IdentityHashMap(java.util.IdentityHashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) LinkedHashMap(java.util.LinkedHashMap) NoUniqueBeanDefinitionException(org.springframework.beans.factory.NoUniqueBeanDefinitionException)

Example 8 with NoUniqueBeanDefinitionException

use of org.springframework.beans.factory.NoUniqueBeanDefinitionException in project leopard by tanhaichao.

the class LeopardPropertyPlaceholderConfigurer method getBean.

public <T> T getBean(BeanFactory beanFactory, Class<T> requiredType) throws BeansException {
    DefaultListableBeanFactory factory = (DefaultListableBeanFactory) beanFactory;
    Map<String, T> matchingBeans = factory.getBeansOfType(requiredType);
    if (matchingBeans.isEmpty()) {
        throw new NoSuchBeanDefinitionException(requiredType);
    }
    if (matchingBeans.size() == 1) {
        return matchingBeans.entrySet().iterator().next().getValue();
    }
    for (Entry<String, T> entry : matchingBeans.entrySet()) {
        T bean = entry.getValue();
        // TODO 还没有支持Bean有AOP
        Primary primary = bean.getClass().getDeclaredAnnotation(Primary.class);
        if (primary != null) {
            return bean;
        }
    }
    throw new NoUniqueBeanDefinitionException(requiredType, matchingBeans.keySet());
}
Also used : Primary(org.springframework.context.annotation.Primary) DefaultListableBeanFactory(org.springframework.beans.factory.support.DefaultListableBeanFactory) NoSuchBeanDefinitionException(org.springframework.beans.factory.NoSuchBeanDefinitionException) NoUniqueBeanDefinitionException(org.springframework.beans.factory.NoUniqueBeanDefinitionException)

Example 9 with NoUniqueBeanDefinitionException

use of org.springframework.beans.factory.NoUniqueBeanDefinitionException in project mule by mulesoft.

the class DefaultListableBeanFactory method doResolveDependency.

public Object doResolveDependency(DependencyDescriptor descriptor, String beanName, Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException {
    Class<?> type = descriptor.getDependencyType();
    Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);
    if (value != null) {
        if (value instanceof String) {
            String strVal = resolveEmbeddedValue((String) value);
            BeanDefinition bd = (beanName != null && containsBean(beanName) ? getMergedBeanDefinition(beanName) : null);
            value = evaluateBeanDefinitionString(strVal, bd);
        }
        TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
        return (descriptor.getField() != null ? converter.convertIfNecessary(value, type, descriptor.getField()) : converter.convertIfNecessary(value, type, descriptor.getMethodParameter()));
    }
    if (type.isArray()) {
        Class<?> componentType = type.getComponentType();
        DependencyDescriptor targetDesc = new DependencyDescriptor(descriptor);
        targetDesc.increaseNestingLevel();
        Map<String, Object> matchingBeans = findAutowireCandidates(beanName, componentType, targetDesc);
        if (matchingBeans.isEmpty()) {
            if (descriptor.isRequired()) {
                raiseNoSuchBeanDefinitionException(componentType, "array of " + componentType.getName(), descriptor);
            }
            return null;
        }
        if (autowiredBeanNames != null) {
            autowiredBeanNames.addAll(matchingBeans.keySet());
        }
        TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
        Object result = converter.convertIfNecessary(matchingBeans.values(), type);
        if (getDependencyComparator() != null && result instanceof Object[]) {
            Arrays.sort((Object[]) result, adaptDependencyComparator(matchingBeans));
        }
        return result;
    } else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {
        Class<?> elementType = descriptor.getCollectionType();
        if (elementType == null) {
            if (descriptor.isRequired()) {
                throw new FatalBeanException("No element type declared for collection [" + type.getName() + "]");
            }
            return null;
        }
        DependencyDescriptor targetDesc = new DependencyDescriptor(descriptor);
        targetDesc.increaseNestingLevel();
        Map<String, Object> matchingBeans = findAutowireCandidates(beanName, elementType, targetDesc);
        if (matchingBeans.isEmpty()) {
            if (descriptor.isRequired()) {
                raiseNoSuchBeanDefinitionException(elementType, "collection of " + elementType.getName(), descriptor);
            }
            return null;
        }
        if (autowiredBeanNames != null) {
            autowiredBeanNames.addAll(matchingBeans.keySet());
        }
        TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
        Object result = converter.convertIfNecessary(matchingBeans.values(), type);
        if (getDependencyComparator() != null && result instanceof List) {
            Collections.sort((List<?>) result, adaptDependencyComparator(matchingBeans));
        }
        return result;
    } else if (Map.class.isAssignableFrom(type) && type.isInterface()) {
        Class<?> keyType = descriptor.getMapKeyType();
        if (keyType == null || !String.class.isAssignableFrom(keyType)) {
            if (descriptor.isRequired()) {
                throw new FatalBeanException("Key type [" + keyType + "] of map [" + type.getName() + "] must be assignable to [java.lang.String]");
            }
            return null;
        }
        Class<?> valueType = descriptor.getMapValueType();
        if (valueType == null) {
            if (descriptor.isRequired()) {
                throw new FatalBeanException("No value type declared for map [" + type.getName() + "]");
            }
            return null;
        }
        DependencyDescriptor targetDesc = new DependencyDescriptor(descriptor);
        targetDesc.increaseNestingLevel();
        Map<String, Object> matchingBeans = findAutowireCandidates(beanName, valueType, targetDesc);
        if (matchingBeans.isEmpty()) {
            if (descriptor.isRequired()) {
                raiseNoSuchBeanDefinitionException(valueType, "map with value type " + valueType.getName(), descriptor);
            }
            return null;
        }
        if (autowiredBeanNames != null) {
            autowiredBeanNames.addAll(matchingBeans.keySet());
        }
        return matchingBeans;
    } else {
        Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);
        if (matchingBeans.isEmpty()) {
            if (descriptor.isRequired()) {
                raiseNoSuchBeanDefinitionException(type, "", descriptor);
            }
            return null;
        }
        if (matchingBeans.size() > 1) {
            String primaryBeanName = determineAutowireCandidate(matchingBeans, descriptor);
            if (primaryBeanName == null) {
                throw new NoUniqueBeanDefinitionException(type, matchingBeans.keySet());
            }
            if (autowiredBeanNames != null) {
                autowiredBeanNames.add(primaryBeanName);
            }
            return matchingBeans.get(primaryBeanName);
        }
        // We have exactly one match.
        Map.Entry<String, Object> entry = matchingBeans.entrySet().iterator().next();
        if (autowiredBeanNames != null) {
            autowiredBeanNames.add(entry.getKey());
        }
        return entry.getValue();
    }
}
Also used : DependencyDescriptor(org.springframework.beans.factory.config.DependencyDescriptor) BeanDefinition(org.springframework.beans.factory.config.BeanDefinition) NoUniqueBeanDefinitionException(org.springframework.beans.factory.NoUniqueBeanDefinitionException) TypeConverter(org.springframework.beans.TypeConverter) FatalBeanException(org.springframework.beans.FatalBeanException) List(java.util.List) ArrayList(java.util.ArrayList) Map(java.util.Map) IdentityHashMap(java.util.IdentityHashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap)

Example 10 with NoUniqueBeanDefinitionException

use of org.springframework.beans.factory.NoUniqueBeanDefinitionException in project spring-security by spring-projects.

the class OAuth2LoginConfigurer method getJwtDecoderFactoryBean.

@SuppressWarnings("unchecked")
private JwtDecoderFactory<ClientRegistration> getJwtDecoderFactoryBean() {
    ResolvableType type = ResolvableType.forClassWithGenerics(JwtDecoderFactory.class, ClientRegistration.class);
    String[] names = this.getBuilder().getSharedObject(ApplicationContext.class).getBeanNamesForType(type);
    if (names.length > 1) {
        throw new NoUniqueBeanDefinitionException(type, names);
    }
    if (names.length == 1) {
        return (JwtDecoderFactory<ClientRegistration>) this.getBuilder().getSharedObject(ApplicationContext.class).getBean(names[0]);
    }
    return null;
}
Also used : ApplicationContext(org.springframework.context.ApplicationContext) JwtDecoderFactory(org.springframework.security.oauth2.jwt.JwtDecoderFactory) ResolvableType(org.springframework.core.ResolvableType) NoUniqueBeanDefinitionException(org.springframework.beans.factory.NoUniqueBeanDefinitionException)

Aggregations

NoUniqueBeanDefinitionException (org.springframework.beans.factory.NoUniqueBeanDefinitionException)10 NoSuchBeanDefinitionException (org.springframework.beans.factory.NoSuchBeanDefinitionException)5 ArrayList (java.util.ArrayList)3 IdentityHashMap (java.util.IdentityHashMap)3 LinkedHashMap (java.util.LinkedHashMap)3 Map (java.util.Map)3 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)3 HashMap (java.util.HashMap)2 Test (org.junit.Test)2 DefaultListableBeanFactory (org.springframework.beans.factory.support.DefaultListableBeanFactory)2 WebApplicationContext (org.springframework.web.context.WebApplicationContext)2 List (java.util.List)1 FatalBeanException (org.springframework.beans.FatalBeanException)1 TypeConverter (org.springframework.beans.TypeConverter)1 BeanDefinition (org.springframework.beans.factory.config.BeanDefinition)1 DependencyDescriptor (org.springframework.beans.factory.config.DependencyDescriptor)1 NamedBeanHolder (org.springframework.beans.factory.config.NamedBeanHolder)1 RootBeanDefinition (org.springframework.beans.factory.support.RootBeanDefinition)1 FailureAnalysis (org.springframework.boot.diagnostics.FailureAnalysis)1 ApplicationContext (org.springframework.context.ApplicationContext)1