strict matching of named arguments

This commit is contained in:
Juergen Hoeller 2009-06-03 13:16:01 +00:00
parent 3426ad3781
commit 81a8b8fd19
1 changed files with 13 additions and 23 deletions

View File

@ -244,31 +244,21 @@ public class ConstructorArgumentValues {
*/
public ValueHolder getGenericArgumentValue(Class requiredType, String requiredName, Set<ValueHolder> usedValueHolders) {
for (ValueHolder valueHolder : this.genericArgumentValues) {
if (usedValueHolders == null || !usedValueHolders.contains(valueHolder)) {
if (requiredType != null) {
// Check matching type.
if (valueHolder.getName() != null) {
if (valueHolder.getName().equals(requiredName)) {
if (usedValueHolders != null && usedValueHolders.contains(valueHolder)) {
continue;
}
if (valueHolder.getName() != null && (requiredName == null || !valueHolder.getName().equals(requiredName))) {
continue;
}
if (valueHolder.getType() != null && (requiredType == null || !valueHolder.getType().equals(requiredType.getName()))) {
continue;
}
if (requiredType != null && valueHolder.getType() == null && valueHolder.getName() == null &&
!ClassUtils.isAssignableValue(requiredType, valueHolder.getValue())) {
continue;
}
return valueHolder;
}
}
else if (valueHolder.getType() != null) {
if (valueHolder.getType().equals(requiredType.getName())) {
return valueHolder;
}
}
else if (ClassUtils.isAssignableValue(requiredType, valueHolder.getValue())) {
return valueHolder;
}
}
else {
// No required type specified -> consider untyped values only.
if (valueHolder.getType() == null) {
return valueHolder;
}
}
}
}
return null;
}