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 d2bce9ce49..f37275ba18 100644 --- a/spring-beans/src/main/java/org/springframework/beans/PropertyMatches.java +++ b/spring-beans/src/main/java/org/springframework/beans/PropertyMatches.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -91,7 +91,7 @@ public abstract class PropertyMatches { private final String propertyName; - private String[] possibleMatches; + private final String[] possibleMatches; /** @@ -155,8 +155,8 @@ public abstract class PropertyMatches { if (s2.isEmpty()) { return s1.length(); } - int[][] d = new int[s1.length() + 1][s2.length() + 1]; + int[][] d = new int[s1.length() + 1][s2.length() + 1]; for (int i = 0; i <= s1.length(); i++) { d[i][0] = i; } @@ -165,18 +165,17 @@ public abstract class PropertyMatches { } for (int i = 1; i <= s1.length(); i++) { - char s_i = s1.charAt(i - 1); + char c1 = s1.charAt(i - 1); for (int j = 1; j <= s2.length(); j++) { int cost; - char t_j = s2.charAt(j - 1); - if (s_i == t_j) { + char c2 = s2.charAt(j - 1); + if (c1 == c2) { cost = 0; } else { cost = 1; } - d[i][j] = Math.min(Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1), - d[i - 1][j - 1] + cost); + d[i][j] = Math.min(Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1), d[i - 1][j - 1] + cost); } } @@ -189,24 +188,23 @@ public abstract class PropertyMatches { private static class BeanPropertyMatches extends PropertyMatches { public BeanPropertyMatches(String propertyName, Class beanClass, int maxDistance) { - super(propertyName, calculateMatches(propertyName, - BeanUtils.getPropertyDescriptors(beanClass), maxDistance)); + super(propertyName, + calculateMatches(propertyName, BeanUtils.getPropertyDescriptors(beanClass), maxDistance)); } /** - * Generate possible property alternatives for the given property and - * class. Internally uses the {@code getStringDistance} method, which - * in turn uses the Levenshtein algorithm to determine the distance between - * two Strings. - * @param propertyDescriptors the JavaBeans property descriptors to search + * Generate possible property alternatives for the given property and class. + * Internally uses the {@code getStringDistance} method, which in turn uses + * the Levenshtein algorithm to determine the distance between two Strings. + * @param descriptors the JavaBeans property descriptors to search * @param maxDistance the maximum distance to accept */ - private static String[] calculateMatches(String propertyName, PropertyDescriptor[] propertyDescriptors, int maxDistance) { + private static String[] calculateMatches(String name, PropertyDescriptor[] descriptors, int maxDistance) { List candidates = new ArrayList<>(); - for (PropertyDescriptor pd : propertyDescriptors) { + for (PropertyDescriptor pd : descriptors) { if (pd.getWriteMethod() != null) { String possibleAlternative = pd.getName(); - if (calculateStringDistance(propertyName, possibleAlternative) <= maxDistance) { + if (calculateStringDistance(name, possibleAlternative) <= maxDistance) { candidates.add(possibleAlternative); } } @@ -215,21 +213,16 @@ public abstract class PropertyMatches { return StringUtils.toStringArray(candidates); } - @Override public String buildErrorMessage() { - String propertyName = getPropertyName(); - String[] possibleMatches = getPossibleMatches(); - StringBuilder msg = new StringBuilder(); - msg.append("Bean property '"); - msg.append(propertyName); - msg.append("' is not writable or has an invalid setter method. "); - - if (ObjectUtils.isEmpty(possibleMatches)) { - msg.append("Does the parameter type of the setter match the return type of the getter?"); + StringBuilder msg = new StringBuilder(160); + msg.append("Bean property '").append(getPropertyName()).append( + "' is not writable or has an invalid setter method. "); + if (!ObjectUtils.isEmpty(getPossibleMatches())) { + appendHintMessage(msg); } else { - appendHintMessage(msg); + msg.append("Does the parameter type of the setter match the return type of the getter?"); } return msg.toString(); } @@ -242,11 +235,11 @@ public abstract class PropertyMatches { super(propertyName, calculateMatches(propertyName, beanClass, maxDistance)); } - private static String[] calculateMatches(final String propertyName, Class beanClass, final int maxDistance) { + private static String[] calculateMatches(final String name, Class clazz, final int maxDistance) { final List candidates = new ArrayList<>(); - ReflectionUtils.doWithFields(beanClass, field -> { + ReflectionUtils.doWithFields(clazz, field -> { String possibleAlternative = field.getName(); - if (calculateStringDistance(propertyName, possibleAlternative) <= maxDistance) { + if (calculateStringDistance(name, possibleAlternative) <= maxDistance) { candidates.add(possibleAlternative); } }); @@ -256,14 +249,10 @@ public abstract class PropertyMatches { @Override public String buildErrorMessage() { - String propertyName = getPropertyName(); - String[] possibleMatches = getPossibleMatches(); - StringBuilder msg = new StringBuilder(); - msg.append("Bean property '"); - msg.append(propertyName); - msg.append("' has no matching field. "); - - if (!ObjectUtils.isEmpty(possibleMatches)) { + StringBuilder msg = new StringBuilder(80); + msg.append("Bean property '").append(getPropertyName()).append("' has no matching field."); + if (!ObjectUtils.isEmpty(getPossibleMatches())) { + msg.append(' '); appendHintMessage(msg); } return msg.toString(); diff --git a/spring-context/src/main/resources/org/springframework/cache/config/spring-cache.xsd b/spring-context/src/main/resources/org/springframework/cache/config/spring-cache.xsd index eebf6677b9..16cbd77695 100644 --- a/spring-context/src/main/resources/org/springframework/cache/config/spring-cache.xsd +++ b/spring-context/src/main/resources/org/springframework/cache/config/spring-cache.xsd @@ -22,17 +22,16 @@ @@ -148,8 +147,7 @@ - @@ -303,7 +300,6 @@ invoked (default) or before.]]> - diff --git a/spring-jms/src/main/resources/org/springframework/jms/config/spring-jms.xsd b/spring-jms/src/main/resources/org/springframework/jms/config/spring-jms.xsd index 0cfeeb6f8c..8b5f7b30e8 100644 --- a/spring-jms/src/main/resources/org/springframework/jms/config/spring-jms.xsd +++ b/spring-jms/src/main/resources/org/springframework/jms/config/spring-jms.xsd @@ -20,12 +20,12 @@ @@ -68,7 +68,7 @@ processor. By default, DefaultMessageHandlerMethodFactory is used and it can be configured further to support additional method arguments or to customize conversion and validation support. See org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory - Javadoc for more details. + javadoc for more details. ]]> @@ -77,8 +77,6 @@ - - @@ -378,14 +376,13 @@ @@ -400,7 +397,8 @@ @@ -478,8 +476,8 @@ diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java index 50d0692e9b..382377ea99 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java @@ -24,7 +24,6 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -182,11 +181,10 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe * but not by consumable/producible media types */ @Override - protected HandlerMethod handleNoMatch(Set infos, String lookupPath, - HttpServletRequest request) throws ServletException { + protected HandlerMethod handleNoMatch( + Set infos, String lookupPath, HttpServletRequest request) throws ServletException { PartialMatchHelper helper = new PartialMatchHelper(infos, request); - if (helper.isEmpty()) { return null; }