Skip to content

Commit 01382b8

Browse files
committed
BeanDefinitionValueResolver preserves original String array if possible and resolves nested String arrays as well
Issue: SPR-12391
1 parent 65d163e commit 01382b8

File tree

1 file changed

+29
-14
lines changed

1 file changed

+29
-14
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionValueResolver.java

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public Object resolveValueIfNecessary(Object argName, Object value) {
109109
}
110110
else if (value instanceof RuntimeBeanNameReference) {
111111
String refName = ((RuntimeBeanNameReference) value).getBeanName();
112-
refName = String.valueOf(evaluate(refName));
112+
refName = String.valueOf(doEvaluate(refName));
113113
if (!this.beanFactory.containsBean(refName)) {
114114
throw new BeanDefinitionStoreException(
115115
"Invalid bean name '" + refName + "' in bean reference for " + argName);
@@ -200,14 +200,6 @@ else if (value instanceof TypedStringValue) {
200200
"Error converting typed String value for " + argName, ex);
201201
}
202202
}
203-
else if (value instanceof String[]) {
204-
String[] values = (String[]) value;
205-
Object[] resolvedValues = new Object[values.length];
206-
for (int i = 0; i < values.length; i++) {
207-
resolvedValues[i] = evaluate(values[i]);
208-
}
209-
return resolvedValues;
210-
}
211203
else {
212204
return evaluate(value);
213205
}
@@ -219,7 +211,7 @@ else if (value instanceof String[]) {
219211
* @return the resolved value
220212
*/
221213
protected Object evaluate(TypedStringValue value) {
222-
Object result = this.beanFactory.evaluateBeanDefinitionString(value.getValue(), this.beanDefinition);
214+
Object result = doEvaluate(value.getValue());
223215
if (!ObjectUtils.nullSafeEquals(result, value.getValue())) {
224216
value.setDynamic();
225217
}
@@ -228,18 +220,41 @@ protected Object evaluate(TypedStringValue value) {
228220

229221
/**
230222
* Evaluate the given value as an expression, if necessary.
231-
* @param value the candidate value (may be an expression)
232-
* @return the resolved value
223+
* @param value the original value (may be an expression)
224+
* @return the resolved value if necessary, or the original value
233225
*/
234226
protected Object evaluate(Object value) {
235227
if (value instanceof String) {
236-
return this.beanFactory.evaluateBeanDefinitionString((String) value, this.beanDefinition);
228+
return doEvaluate((String) value);
229+
}
230+
else if (value instanceof String[]) {
231+
String[] values = (String[]) value;
232+
boolean actuallyResolved = false;
233+
Object[] resolvedValues = new Object[values.length];
234+
for (int i = 0; i < values.length; i++) {
235+
String originalValue = values[i];
236+
Object resolvedValue = doEvaluate(originalValue);
237+
if (resolvedValue != originalValue) {
238+
actuallyResolved = true;
239+
}
240+
resolvedValues[i] = resolvedValue;
241+
}
242+
return (actuallyResolved ? resolvedValues : values);
237243
}
238244
else {
239245
return value;
240246
}
241247
}
242248

249+
/**
250+
* Evaluate the given String value as an expression, if necessary.
251+
* @param value the original value (may be an expression)
252+
* @return the resolved value if necessary, or the original String value
253+
*/
254+
private Object doEvaluate(String value) {
255+
return this.beanFactory.evaluateBeanDefinitionString(value, this.beanDefinition);
256+
}
257+
243258
/**
244259
* Resolve the target type in the given TypedStringValue.
245260
* @param value the TypedStringValue to resolve
@@ -322,7 +337,7 @@ private String adaptInnerBeanName(String innerBeanName) {
322337
private Object resolveReference(Object argName, RuntimeBeanReference ref) {
323338
try {
324339
String refName = ref.getBeanName();
325-
refName = String.valueOf(evaluate(refName));
340+
refName = String.valueOf(doEvaluate(refName));
326341
if (ref.isToParent()) {
327342
if (this.beanFactory.getParentBeanFactory() == null) {
328343
throw new BeanCreationException(

0 commit comments

Comments
 (0)