diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java index 4443e017b1..560a9ac9f6 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java @@ -370,8 +370,8 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp } catch (TypeMismatchException ex) { if (logger.isDebugEnabled()) { - logger.debug("Failed to convert bean '" + name + "' to required type [" + - ClassUtils.getQualifiedName(requiredType) + "]", ex); + logger.debug("Failed to convert bean '" + name + "' to required type '" + + ClassUtils.getQualifiedName(requiredType) + "'", ex); } throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } @@ -803,12 +803,15 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp @Override public String resolveEmbeddedValue(String value) { + if (value == null) { + return null; + } String result = value; for (StringValueResolver resolver : this.embeddedValueResolvers) { + result = resolver.resolveStringValue(result); if (result == null) { return null; } - result = resolver.resolveStringValue(result); } return result; } diff --git a/spring-core/src/main/java/org/springframework/util/StringValueResolver.java b/spring-core/src/main/java/org/springframework/util/StringValueResolver.java index fe7799d3fc..8ed24ea7d2 100644 --- a/spring-core/src/main/java/org/springframework/util/StringValueResolver.java +++ b/spring-core/src/main/java/org/springframework/util/StringValueResolver.java @@ -31,8 +31,11 @@ public interface StringValueResolver { /** * Resolve the given String value, for example parsing placeholders. - * @param strVal the original String value - * @return the resolved String value + * @param strVal the original String value (never {@code null}) + * @return the resolved String value (may be {@code null} when resolved to a null + * value), possibly the original String value itself (in case of no placeholders + * to resolve or when ignoring unresolvable placeholders) + * @throws IllegalArgumentException in case of an unresolvable String value */ String resolveStringValue(String strVal);