Details
-
Improvement
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
None
-
None
Description
Our application must be adaptable for customer needs. We therefore need to be able to inject customer specific services. Since all our services are autowired, we could solve this by using the "primary" attribute.
Our propsal is to patch SpringBeanLocator:
private final String getBeanNameOfClass(ApplicationContext ctx, Class< ? > clazz) {
// get the list of all possible matching beans
List<String> names = new ArrayList<String>(Arrays.asList(BeanFactoryUtils .beanNamesForTypeIncludingAncestors(ctx, clazz)));
Iterator<String> it = names.iterator();
// filter out beans that are not condidates for autowiring
while (it.hasNext()) {
final String possibility = it.next();
if (BeanFactoryUtils.isFactoryDereference(possibility) || possibility.startsWith("scopedTarget."))
}
if (names.isEmpty())
else if (names.size() > 1) {
///////////////////////// add this ///////////////////////////////////////////////
for (String name : names){
BeanDefinition beanDef = ((AbstractApplicationContext)ctx).getBeanFactory().getBeanDefinition(name);
if(((AbstractBeanDefinition)beanDef).isPrimary())
}
//////////////////////////////////////////////////////////////////////////////////////
// found no match
StringBuilder msg = new StringBuilder();
msg.append("more then one bean of type [");
msg.append(clazz.getName());
msg.append("] found, you have to specify the name of the bean ");
msg.append("(@SpringBean(name=\"foo\")) in order to resolve this conflict. ");
msg.append("Matched beans: ");
msg.append(Strings.join(",", names.toArray(new String[0])));
throw new IllegalStateException(msg.toString());
}
else
}