diff --git a/src/main/java/org/springframework/data/mapping/model/Property.java b/src/main/java/org/springframework/data/mapping/model/Property.java index 62470a868..5365d210e 100644 --- a/src/main/java/org/springframework/data/mapping/model/Property.java +++ b/src/main/java/org/springframework/data/mapping/model/Property.java @@ -82,23 +82,6 @@ public class Property { this.wither = Lazy.of(() -> findWither(type, getName(), getType())); } - private static Optional findWither(TypeInformation owner, String propertyName, Class rawType) { - - AtomicReference resultHolder = new AtomicReference<>(); - String methodName = String.format("with%s", StringUtils.capitalize(propertyName)); - - ReflectionUtils.doWithMethods(owner.getType(), it -> { - - if (owner.isAssignableFrom(owner.getReturnType(it))) { - resultHolder.set(it); - } - }, it -> it.getName().equals(methodName) && it.getParameterCount() == 1 - && it.getParameterTypes()[0].equals(rawType)); - - Method method = resultHolder.get(); - return method != null ? Optional.of(method) : Optional.empty(); - } - /** * Creates a new {@link Property} backed by the given field. * @@ -285,4 +268,27 @@ public class Property { () -> this.descriptor.map(descriptor))// .orElseThrow(() -> new IllegalStateException("Should not occur! Either field or descriptor has to be given")); } + + private static Optional findWither(TypeInformation owner, String propertyName, Class rawType) { + + AtomicReference resultHolder = new AtomicReference<>(); + String methodName = String.format("with%s", StringUtils.capitalize(propertyName)); + + ReflectionUtils.doWithMethods(owner.getType(), it -> { + + if (owner.isAssignableFrom(owner.getReturnType(it))) { + resultHolder.set(it); + } + }, it -> isMethodWithSingleParameterOfType(it, methodName, rawType)); + + Method method = resultHolder.get(); + return method != null ? Optional.of(method) : Optional.empty(); + } + + private static boolean isMethodWithSingleParameterOfType(Method method, String name, Class type) { + + return method.getParameterCount() == 1 // + && method.getName().equals(name) // + && method.getParameterTypes()[0].equals(type); + } }