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");