diff --git a/spring-beans/src/main/java/org/springframework/beans/PropertyMatches.java b/spring-beans/src/main/java/org/springframework/beans/PropertyMatches.java index c7fa7b690d..2190b06749 100644 --- a/spring-beans/src/main/java/org/springframework/beans/PropertyMatches.java +++ b/spring-beans/src/main/java/org/springframework/beans/PropertyMatches.java @@ -30,8 +30,8 @@ import org.springframework.util.StringUtils; * Helper class for calculating property matches, according to a configurable * distance. Provide the list of potential matches and an easy way to generate * an error message. Works for both java bean properties and fields. - *

- * Mainly for use within the framework and in particular the binding facility + * + *

Mainly for use within the framework and in particular the binding facility. * * @author Alef Arendsen * @author Arjen Poutsma @@ -43,14 +43,12 @@ import org.springframework.util.StringUtils; */ public abstract class PropertyMatches { - //--------------------------------------------------------------------- - // Static section - //--------------------------------------------------------------------- - /** Default maximum property distance: 2 */ public static final int DEFAULT_MAX_DISTANCE = 2; + // Static factory methods + /** * Create PropertyMatches for the given bean property. * @param propertyName the name of the property to find possible matches for @@ -90,9 +88,7 @@ public abstract class PropertyMatches { } - //--------------------------------------------------------------------- - // Instance section - //--------------------------------------------------------------------- + // Instance state private final String propertyName; @@ -107,18 +103,19 @@ public abstract class PropertyMatches { this.possibleMatches = possibleMatches; } + /** * Return the name of the requested property. */ public String getPropertyName() { - return propertyName; + return this.propertyName; } /** * Return the calculated possible matches. */ public String[] getPossibleMatches() { - return possibleMatches; + return this.possibleMatches; } /** @@ -127,6 +124,9 @@ public abstract class PropertyMatches { */ public abstract String buildErrorMessage(); + + // Implementation support for subclasses + protected void appendHintMessage(StringBuilder msg) { msg.append("Did you mean "); for (int i = 0; i < this.possibleMatches.length; i++) { @@ -184,9 +184,12 @@ public abstract class PropertyMatches { return d[s1.length()][s2.length()]; } + + // Concrete subclasses + private static class BeanPropertyMatches extends PropertyMatches { - private BeanPropertyMatches(String propertyName, Class beanClass, int maxDistance) { + public BeanPropertyMatches(String propertyName, Class beanClass, int maxDistance) { super(propertyName, calculateMatches(propertyName, BeanUtils.getPropertyDescriptors(beanClass), maxDistance)); } @@ -231,12 +234,12 @@ public abstract class PropertyMatches { } return msg.toString(); } - } + private static class FieldPropertyMatches extends PropertyMatches { - private FieldPropertyMatches(String propertyName, Class beanClass, int maxDistance) { + public FieldPropertyMatches(String propertyName, Class beanClass, int maxDistance) { super(propertyName, calculateMatches(propertyName, beanClass, maxDistance)); } @@ -255,7 +258,6 @@ public abstract class PropertyMatches { return StringUtils.toStringArray(candidates); } - @Override public String buildErrorMessage() { String propertyName = getPropertyName(); @@ -270,7 +272,6 @@ public abstract class PropertyMatches { } return msg.toString(); } - } } diff --git a/spring-context/src/main/java/org/springframework/context/support/ConversionServiceFactoryBean.java b/spring-context/src/main/java/org/springframework/context/support/ConversionServiceFactoryBean.java index 5cf2e81746..2bba3f2c61 100644 --- a/spring-context/src/main/java/org/springframework/context/support/ConversionServiceFactoryBean.java +++ b/spring-context/src/main/java/org/springframework/context/support/ConversionServiceFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,12 +27,12 @@ import org.springframework.core.convert.support.GenericConversionService; /** * A factory providing convenient access to a ConversionService configured with - * converters appropriate for most environments. Set the {@link #setConverters - * "converters"} property to supplement the default converters. + * converters appropriate for most environments. Set the + * {@link #setConverters "converters"} property to supplement the default converters. * - *

This implementation creates a {@link DefaultConversionService}. Subclasses - * may override {@link #createConversionService()} in order to return a - * {@link GenericConversionService} instance of their choosing. + *

This implementation creates a {@link DefaultConversionService}. + * Subclasses may override {@link #createConversionService()} in order to return + * a {@link GenericConversionService} instance of their choosing. * *

Like all {@code FactoryBean} implementations, this class is suitable for * use when configuring a Spring application context using Spring {@code } diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java b/spring-core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java index 4082dc575e..172050246f 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java @@ -33,6 +33,7 @@ abstract class ConversionUtils { public static Object invokeConverter(GenericConverter converter, Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { + try { return converter.convert(source, sourceType, targetType); } @@ -44,7 +45,9 @@ abstract class ConversionUtils { } } - public static boolean canConvertElements(TypeDescriptor sourceElementType, TypeDescriptor targetElementType, ConversionService conversionService) { + public static boolean canConvertElements(TypeDescriptor sourceElementType, TypeDescriptor targetElementType, + ConversionService conversionService) { + if (targetElementType == null) { // yes return true; @@ -58,11 +61,11 @@ abstract class ConversionUtils { return true; } else if (sourceElementType.getType().isAssignableFrom(targetElementType.getType())) { - // maybe; + // maybe return true; } else { - // no; + // no return false; } }