diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java index 889aac2050..47e7ad7823 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,6 +42,7 @@ import org.springframework.beans.PropertyEditorRegistry; import org.springframework.beans.PropertyEditorRegistrySupport; import org.springframework.beans.SimpleTypeConverter; import org.springframework.beans.TypeConverter; +import org.springframework.beans.TypeMismatchException; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanCurrentlyInCreationException; import org.springframework.beans.factory.BeanDefinitionStoreException; @@ -68,8 +69,6 @@ import org.springframework.beans.factory.config.Scope; import org.springframework.core.DecoratingClassLoader; import org.springframework.core.NamedThreadLocal; import org.springframework.core.convert.ConversionService; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.StandardEnvironment; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; @@ -350,7 +349,16 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp // Check if required type matches the type of the actual bean instance. if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) { - throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); + try { + return getTypeConverter().convertIfNecessary(bean, requiredType); + } + catch (TypeMismatchException ex) { + if (logger.isDebugEnabled()) { + logger.debug("Failed to convert bean '" + name + "' to required type [" + + ClassUtils.getQualifiedName(requiredType) + "]", ex); + } + throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); + } } return (T) bean; } diff --git a/org.springframework.context/src/test/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessorTests.java b/org.springframework.context/src/test/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessorTests.java index b510e257aa..a79af0460d 100644 --- a/org.springframework.context/src/test/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessorTests.java +++ b/org.springframework.context/src/test/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ import javax.annotation.PreDestroy; import javax.annotation.Resource; import javax.ejb.EJB; -import static org.junit.Assert.*; import org.junit.Test; import org.springframework.beans.BeansException; @@ -43,6 +42,8 @@ import org.springframework.jndi.support.SimpleJndiBeanFactory; import org.springframework.mock.jndi.ExpectedLookupTemplate; import org.springframework.util.SerializationTestUtils; +import static org.junit.Assert.*; + /** * @author Juergen Hoeller * @author Chris Beams @@ -229,6 +230,7 @@ public class CommonAnnotationBeanPostProcessorTests { bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ExtendedResourceInjectionBean.class)); bf.registerBeanDefinition("annotatedBean2", new RootBeanDefinition(NamedResourceInjectionBean.class)); + bf.registerBeanDefinition("annotatedBean3", new RootBeanDefinition(ConvertedResourceInjectionBean.class)); TestBean tb = new TestBean(); bf.registerSingleton("testBean", tb); TestBean tb2 = new TestBean(); @@ -238,6 +240,7 @@ public class CommonAnnotationBeanPostProcessorTests { TestBean tb4 = new TestBean(); bf.registerSingleton("testBean4", tb4); NestedTestBean tb6 = new NestedTestBean(); + bf.registerSingleton("value", new Object()); bf.registerSingleton("xy", tb6); bf.registerAlias("xy", "testBean9"); @@ -255,6 +258,9 @@ public class CommonAnnotationBeanPostProcessorTests { NamedResourceInjectionBean bean2 = (NamedResourceInjectionBean) bf.getBean("annotatedBean2"); assertSame(tb6, bean2.testBean); + ConvertedResourceInjectionBean bean3 = (ConvertedResourceInjectionBean) bf.getBean("annotatedBean3"); + assertSame(5, bean3.value); + bf.destroySingletons(); assertTrue(bean.destroyCalled); assertTrue(bean.destroy2Called); @@ -591,6 +597,13 @@ public class CommonAnnotationBeanPostProcessorTests { } + private static class ConvertedResourceInjectionBean { + + @Resource(name="value") + private int value; + } + + private static class NullFactory { public static Object create() {