From 8cabeca24ff86bdfd1f51e587279ff5a9cf3af9f Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 10 Nov 2025 17:06:54 +0100 Subject: [PATCH] Filter bridge methods from `DefaultCrudMethods` lookup. We now filter bridge methods when looking up the most specific method when looking for an override. Closes #3401 --- .../core/support/DefaultCrudMethods.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/core/support/DefaultCrudMethods.java b/src/main/java/org/springframework/data/repository/core/support/DefaultCrudMethods.java index b090f4996..b5df78e7b 100644 --- a/src/main/java/org/springframework/data/repository/core/support/DefaultCrudMethods.java +++ b/src/main/java/org/springframework/data/repository/core/support/DefaultCrudMethods.java @@ -15,10 +15,12 @@ */ package org.springframework.data.repository.core.support; -import static java.util.Arrays.*; import static org.springframework.data.util.Optionals.*; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Stream; @@ -85,7 +87,7 @@ public class DefaultCrudMethods implements CrudMethods { */ private static Optional selectMostSuitableSaveMethod(RepositoryMetadata metadata) { - return asList(metadata.getDomainType(), Object.class).stream()// + return Arrays.asList(metadata.getDomainType(), Object.class).stream()// .flatMap(it -> toStream(findMethod(metadata.getRepositoryInterface(), SAVE, it)))// .flatMap(it -> toStream(getMostSpecificMethod(it, metadata.getRepositoryInterface())))// .findFirst(); @@ -160,7 +162,7 @@ public class DefaultCrudMethods implements CrudMethods { */ private static Optional selectMostSuitableFindOneMethod(RepositoryMetadata metadata) { - return asList(metadata.getIdType(), Object.class).stream()// + return Arrays.asList(metadata.getIdType(), Object.class).stream()// .flatMap(it -> toStream(findMethod(metadata.getRepositoryInterface(), FIND_ONE, it)))// .flatMap(it -> toStream(getMostSpecificMethod(it, metadata.getRepositoryInterface())))// .findFirst(); @@ -224,6 +226,19 @@ public class DefaultCrudMethods implements CrudMethods { } private static Optional findMethod(Class type, String name, Class... parameterTypes) { + + List candidates = new ArrayList<>(); + ReflectionUtils.doWithMethods(type, candidates::add, + it -> it.getName().equals(name) && hasSameParams(it, parameterTypes) && !it.isBridge()); + + if (!candidates.isEmpty()) { + return Optional.of(candidates.get(0)); + } + return Optional.ofNullable(ReflectionUtils.findMethod(type, name, parameterTypes)); } + + private static boolean hasSameParams(Method method, Class[] paramTypes) { + return (paramTypes.length == method.getParameterCount() && Arrays.equals(paramTypes, method.getParameterTypes())); + } }