diff --git a/src/main/java/org/springframework/data/repository/query/Parameter.java b/src/main/java/org/springframework/data/repository/query/Parameter.java index 5022aba6d..2c26d7cdd 100644 --- a/src/main/java/org/springframework/data/repository/query/Parameter.java +++ b/src/main/java/org/springframework/data/repository/query/Parameter.java @@ -260,7 +260,7 @@ public class Parameter { throw new IllegalArgumentException("Parameter is not associated with any method"); } - var returnType = TypeInformation.fromReturnTypeOf(method); + var returnType = TypeInformation.fromReturnTypeOf(method, parameter.getContainingClass()); var unwrapped = QueryExecutionConverters.unwrapWrapperTypes(returnType); var reactiveUnwrapped = ReactiveWrapperConverters.unwrapWrapperTypes(unwrapped); diff --git a/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolverSupport.java b/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolverSupport.java index 748289b06..98362acb1 100644 --- a/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolverSupport.java +++ b/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolverSupport.java @@ -146,7 +146,7 @@ public abstract class QuerydslPredicateArgumentResolverSupport { throw new IllegalArgumentException("Method parameter is not backed by a method"); } - return detectDomainType(TypeInformation.fromReturnTypeOf(method)); + return detectDomainType(TypeInformation.fromReturnTypeOf(method, parameter.getContainingClass())); } private static TypeInformation detectDomainType(TypeInformation source) { diff --git a/src/test/java/org/springframework/data/repository/query/ParameterUnitTests.java b/src/test/java/org/springframework/data/repository/query/ParameterUnitTests.java index f3b7d5b57..2c1b017f9 100644 --- a/src/test/java/org/springframework/data/repository/query/ParameterUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/ParameterUnitTests.java @@ -23,10 +23,10 @@ import java.util.Optional; import java.util.function.Function; import java.util.stream.Stream; -import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestFactory; + import org.springframework.core.MethodParameter; import org.springframework.data.repository.query.ParametersUnitTests.User; import org.springframework.data.util.TypeInformation; @@ -85,7 +85,6 @@ class ParameterUnitTests { assertThat(parameter.isDynamicProjectionParameter()).isFalse(); } - @NotNull private MethodParameter getMethodParameter(String methodName) throws NoSuchMethodException { return new MethodParameter(this.getClass().getDeclaredMethod(methodName, Class.class), 0); } @@ -117,4 +116,5 @@ class ParameterUnitTests { T atParamOnClass(@Param("type") Class type) { return null; } + } diff --git a/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java b/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java index f382a95e8..d827f65b0 100755 --- a/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java @@ -159,6 +159,16 @@ class ParametersUnitTests { assertThat(parameters.getParameter(2).isDynamicProjectionParameter()).isFalse(); } + @Test // GH-3020 + void detectsDynamicParametrizedProjectionParameter() throws Exception { + + var method = ParametrizedRepository.class.getMethod("dynamicBind", Class.class); + var parameters = new DefaultParameters( + ParametersSource.of(new DefaultRepositoryMetadata(ParametrizedRepository.class), method)); + + assertThat(parameters.getParameter(0).isDynamicProjectionParameter()).isTrue(); + } + @Test // DATACMNS-863 void unwrapsOptionals() throws Exception { @@ -272,4 +282,12 @@ class ParametersUnitTests { interface TypedInterface extends Intermediate {} + interface GenericRepository extends Repository { +

> Optional

dynamicBind(Class

type); + } + + interface ParametrizedRepository extends GenericRepository {} + + interface Projection {} + }