From 0874513d0e138354419513b8f22537cd0307f2fd Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 16 Jul 2009 17:22:03 +0000 Subject: [PATCH] revised lenient constructor resolution (follow-up to SPR-5816) git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@1552 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../factory/support/ConstructorResolver.java | 20 +++++++++++-------- .../XmlBeanFactoryTests-constructorArg.xml | 4 ++++ .../factory/xml/XmlBeanFactoryTests.java | 11 +++++++++- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java index 63462f3f477..a9dc14bf194 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java @@ -573,20 +573,15 @@ class ConstructorResolver { (ConstructorArgumentValues.ValueHolder) valueHolder.getSource(); Object originalValue = valueHolder.getValue(); Object sourceValue = sourceHolder.getValue(); + Object convertedValue; if (valueHolder.isConverted()) { - Object convertedValue = valueHolder.getConvertedValue(); - args.rawArguments[paramIndex] = - (mbd.isLenientConstructorResolution() ? originalValue : convertedValue); - args.arguments[paramIndex] = convertedValue; + convertedValue = valueHolder.getConvertedValue(); args.preparedArguments[paramIndex] = convertedValue; } else { try { - Object convertedValue = converter.convertIfNecessary(originalValue, paramType, + convertedValue = converter.convertIfNecessary(originalValue, paramType, MethodParameter.forMethodOrConstructor(methodOrCtor, paramIndex)); - args.rawArguments[paramIndex] = - (mbd.isLenientConstructorResolution() ? originalValue : convertedValue); - args.arguments[paramIndex] = convertedValue; if (originalValue == sourceValue || sourceValue instanceof TypedStringValue) { // Either a converted value or still the original one: store converted value. sourceHolder.setConvertedValue(convertedValue); @@ -605,6 +600,15 @@ class ConstructorResolver { "] to required type [" + paramType.getName() + "]: " + ex.getMessage()); } } + args.arguments[paramIndex] = convertedValue; + if (mbd.isLenientConstructorResolution()) { + args.rawArguments[paramIndex] = originalValue; + } + else { + args.rawArguments[paramIndex] = + ((sourceValue instanceof TypedStringValue && !((TypedStringValue) sourceValue).hasTargetType()) ? + convertedValue : originalValue); + } } else { // No explicit match found: we're either supposed to autowire or diff --git a/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/XmlBeanFactoryTests-constructorArg.xml b/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/XmlBeanFactoryTests-constructorArg.xml index e12640a6faa..39e6dfaa8e3 100644 --- a/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/XmlBeanFactoryTests-constructorArg.xml +++ b/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/XmlBeanFactoryTests-constructorArg.xml @@ -175,6 +175,10 @@ true + + test + + diff --git a/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/XmlBeanFactoryTests.java b/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/XmlBeanFactoryTests.java index 633be540d6d..7151096ff6c 100644 --- a/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/XmlBeanFactoryTests.java +++ b/org.springframework.context/src/test/java/org/springframework/beans/factory/xml/XmlBeanFactoryTests.java @@ -53,10 +53,10 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.UnsatisfiedDependencyException; import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.MethodReplacer; import org.springframework.beans.factory.support.RootBeanDefinition; -import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.UrlResource; @@ -805,6 +805,7 @@ public final class XmlBeanFactoryTests { fail("Must have thrown a FatalBeanException"); } catch (FatalBeanException expected) { + // expected } DependenciesBean rod5 = (DependenciesBean) xbf.getBean("rod5"); @@ -1379,6 +1380,14 @@ public final class XmlBeanFactoryTests { } } + public @Test void testStringConstructor() { + XmlBeanFactory xbf = new XmlBeanFactory(CONSTRUCTOR_ARG_CONTEXT); + AbstractBeanDefinition bd = (AbstractBeanDefinition) xbf.getBeanDefinition("string"); + bd.setLenientConstructorResolution(false); + String str = (String) xbf.getBean("string"); + assertEquals("test", str); + } + public @Test void testPrimitiveConstructorArray() { XmlBeanFactory xbf = new XmlBeanFactory(CONSTRUCTOR_ARG_CONTEXT); ConstructorArrayTestBean bean = (ConstructorArrayTestBean) xbf.getBean("constructorArray");