BeanDefinitionValueResolver preserves original String array if possible and resolves nested String arrays as well

Issue: SPR-12391
This commit is contained in:
Juergen Hoeller 2014-10-31 17:57:06 +01:00
parent 65d163e604
commit 01382b8ff0
1 changed files with 29 additions and 14 deletions

View File

@ -109,7 +109,7 @@ class BeanDefinitionValueResolver {
} }
else if (value instanceof RuntimeBeanNameReference) { else if (value instanceof RuntimeBeanNameReference) {
String refName = ((RuntimeBeanNameReference) value).getBeanName(); String refName = ((RuntimeBeanNameReference) value).getBeanName();
refName = String.valueOf(evaluate(refName)); refName = String.valueOf(doEvaluate(refName));
if (!this.beanFactory.containsBean(refName)) { if (!this.beanFactory.containsBean(refName)) {
throw new BeanDefinitionStoreException( throw new BeanDefinitionStoreException(
"Invalid bean name '" + refName + "' in bean reference for " + argName); "Invalid bean name '" + refName + "' in bean reference for " + argName);
@ -200,14 +200,6 @@ class BeanDefinitionValueResolver {
"Error converting typed String value for " + argName, ex); "Error converting typed String value for " + argName, ex);
} }
} }
else if (value instanceof String[]) {
String[] values = (String[]) value;
Object[] resolvedValues = new Object[values.length];
for (int i = 0; i < values.length; i++) {
resolvedValues[i] = evaluate(values[i]);
}
return resolvedValues;
}
else { else {
return evaluate(value); return evaluate(value);
} }
@ -219,7 +211,7 @@ class BeanDefinitionValueResolver {
* @return the resolved value * @return the resolved value
*/ */
protected Object evaluate(TypedStringValue value) { protected Object evaluate(TypedStringValue value) {
Object result = this.beanFactory.evaluateBeanDefinitionString(value.getValue(), this.beanDefinition); Object result = doEvaluate(value.getValue());
if (!ObjectUtils.nullSafeEquals(result, value.getValue())) { if (!ObjectUtils.nullSafeEquals(result, value.getValue())) {
value.setDynamic(); value.setDynamic();
} }
@ -228,18 +220,41 @@ class BeanDefinitionValueResolver {
/** /**
* Evaluate the given value as an expression, if necessary. * Evaluate the given value as an expression, if necessary.
* @param value the candidate value (may be an expression) * @param value the original value (may be an expression)
* @return the resolved value * @return the resolved value if necessary, or the original value
*/ */
protected Object evaluate(Object value) { protected Object evaluate(Object value) {
if (value instanceof String) { if (value instanceof String) {
return this.beanFactory.evaluateBeanDefinitionString((String) value, this.beanDefinition); return doEvaluate((String) value);
}
else if (value instanceof String[]) {
String[] values = (String[]) value;
boolean actuallyResolved = false;
Object[] resolvedValues = new Object[values.length];
for (int i = 0; i < values.length; i++) {
String originalValue = values[i];
Object resolvedValue = doEvaluate(originalValue);
if (resolvedValue != originalValue) {
actuallyResolved = true;
}
resolvedValues[i] = resolvedValue;
}
return (actuallyResolved ? resolvedValues : values);
} }
else { else {
return value; return value;
} }
} }
/**
* Evaluate the given String value as an expression, if necessary.
* @param value the original value (may be an expression)
* @return the resolved value if necessary, or the original String value
*/
private Object doEvaluate(String value) {
return this.beanFactory.evaluateBeanDefinitionString(value, this.beanDefinition);
}
/** /**
* Resolve the target type in the given TypedStringValue. * Resolve the target type in the given TypedStringValue.
* @param value the TypedStringValue to resolve * @param value the TypedStringValue to resolve
@ -322,7 +337,7 @@ class BeanDefinitionValueResolver {
private Object resolveReference(Object argName, RuntimeBeanReference ref) { private Object resolveReference(Object argName, RuntimeBeanReference ref) {
try { try {
String refName = ref.getBeanName(); String refName = ref.getBeanName();
refName = String.valueOf(evaluate(refName)); refName = String.valueOf(doEvaluate(refName));
if (ref.isToParent()) { if (ref.isToParent()) {
if (this.beanFactory.getParentBeanFactory() == null) { if (this.beanFactory.getParentBeanFactory() == null) {
throw new BeanCreationException( throw new BeanCreationException(