Author: gseitz Date: Fri May 28 23:49:38 2010 New Revision: 949322 URL: http://svn.apache.org/viewvc?rev=949322&view=rev Log: WICKET-2900: look for bean definition in parent contexts WICKET-2901: only return a primary bean if it's the only one
Modified: wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/SpringBeanLocator.java wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java Modified: wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/SpringBeanLocator.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/SpringBeanLocator.java?rev=949322&r1=949321&r2=949322&view=diff ============================================================================== --- wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/SpringBeanLocator.java (original) +++ wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/SpringBeanLocator.java Fri May 28 23:49:38 2010 @@ -26,9 +26,11 @@ import org.apache.wicket.proxy.IProxyTar import org.apache.wicket.util.lang.Objects; import org.apache.wicket.util.lang.WicketObjects; import org.apache.wicket.util.string.Strings; +import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; @@ -120,12 +122,15 @@ public class SpringBeanLocator implement while (it.hasNext()) { final String possibility = it.next(); - BeanDefinition beanDef = ((AbstractApplicationContext)ctx).getBeanFactory() - .getBeanDefinition(possibility); - if (BeanFactoryUtils.isFactoryDereference(possibility) || - possibility.startsWith("scopedTarget.") || !beanDef.isAutowireCandidate()) + if (ctx instanceof AbstractApplicationContext) { - it.remove(); + BeanDefinition beanDef = getBeanDefinition(((AbstractApplicationContext)ctx) + .getBeanFactory(), possibility); + if (BeanFactoryUtils.isFactoryDereference(possibility) || + possibility.startsWith("scopedTarget.") || !beanDef.isAutowireCandidate()) + { + it.remove(); + } } } @@ -137,18 +142,23 @@ public class SpringBeanLocator implement { if (ctx instanceof AbstractApplicationContext) { + List<String> primaries = new ArrayList<String>(); for (String name : names) { - BeanDefinition beanDef = ((AbstractApplicationContext)ctx).getBeanFactory() - .getBeanDefinition(name); + BeanDefinition beanDef = getBeanDefinition(((AbstractApplicationContext)ctx) + .getBeanFactory(), name); if (beanDef instanceof AbstractBeanDefinition) { if (((AbstractBeanDefinition)beanDef).isPrimary()) { - return name; + primaries.add(name); } } } + if (primaries.size() == 1) + { + return primaries.get(0); + } } StringBuilder msg = new StringBuilder(); @@ -166,6 +176,28 @@ public class SpringBeanLocator implement } } + private BeanDefinition getBeanDefinition(ConfigurableListableBeanFactory beanFactory, + String name) + { + if (beanFactory.containsBeanDefinition(name)) + { + return beanFactory.getBeanDefinition(name); + } + else + { + BeanFactory parent = beanFactory.getParentBeanFactory(); + if (parent != null && parent instanceof ConfigurableListableBeanFactory) + { + return getBeanDefinition(beanFactory, name); + } + else + { + return null; + } + } + } + + /** * @return returns whether the bean (the locator is supposed to istantiate) is a singleton or * not Modified: wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java?rev=949322&r1=949321&r2=949322&view=diff ============================================================================== --- wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java (original) +++ wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java Fri May 28 23:49:38 2010 @@ -29,8 +29,10 @@ import org.apache.wicket.spring.ISpringC import org.apache.wicket.spring.SpringBeanLocator; import org.apache.wicket.util.lang.Generics; import org.apache.wicket.util.string.Strings; +import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; @@ -187,12 +189,15 @@ public class AnnotProxyFieldValueFactory while (it.hasNext()) { final String possibility = it.next(); - BeanDefinition beanDef = ((AbstractApplicationContext)ctx).getBeanFactory() - .getBeanDefinition(possibility); - if (BeanFactoryUtils.isFactoryDereference(possibility) || - possibility.startsWith("scopedTarget.") || !beanDef.isAutowireCandidate()) + if (ctx instanceof AbstractApplicationContext) { - it.remove(); + BeanDefinition beanDef = getBeanDefinition(((AbstractApplicationContext)ctx) + .getBeanFactory(), possibility); + if (BeanFactoryUtils.isFactoryDereference(possibility) || + possibility.startsWith("scopedTarget.") || !beanDef.isAutowireCandidate()) + { + it.remove(); + } } } @@ -204,18 +209,23 @@ public class AnnotProxyFieldValueFactory { if (ctx instanceof AbstractApplicationContext) { + List<String> primaries = new ArrayList<String>(); for (String name : names) { - BeanDefinition beanDef = ((AbstractApplicationContext)ctx).getBeanFactory() - .getBeanDefinition(name); + BeanDefinition beanDef = getBeanDefinition(((AbstractApplicationContext)ctx) + .getBeanFactory(), name); if (beanDef instanceof AbstractBeanDefinition) { if (((AbstractBeanDefinition)beanDef).isPrimary()) { - return name; + primaries.add(name); } } } + if (primaries.size() == 1) + { + return primaries.get(0); + } } StringBuilder msg = new StringBuilder(); msg.append("More than one bean of type ["); @@ -232,6 +242,28 @@ public class AnnotProxyFieldValueFactory } } + private BeanDefinition getBeanDefinition(ConfigurableListableBeanFactory beanFactory, + String name) + { + if (beanFactory.containsBeanDefinition(name)) + { + return beanFactory.getBeanDefinition(name); + } + else + { + BeanFactory parent = beanFactory.getParentBeanFactory(); + if (parent != null && parent instanceof ConfigurableListableBeanFactory) + { + return getBeanDefinition(beanFactory, name); + } + else + { + return null; + } + } + } + + /** * @see org.apache.wicket.injection.IFieldValueFactory#supportsField(java.lang.reflect.Field) */