BeanDefinitionValueResolver preserves original String array if possible and resolves nested String arrays as well
Issue: SPR-12391
This commit is contained in:
parent
65d163e604
commit
01382b8ff0
|
@ -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(
|
||||||
|
|
Loading…
Reference in New Issue