Skip to content

Commit 34b24a5

Browse files
committed
Consider enclosing class for dynamic projection parameter detection.
We now consider the enclosing class to determine correct generic typing. Closes #3020
1 parent 20d150f commit 34b24a5

File tree

4 files changed

+22
-4
lines changed

4 files changed

+22
-4
lines changed

src/main/java/org/springframework/data/repository/query/Parameter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ private static boolean isDynamicProjectionParameter(MethodParameter parameter, T
260260
throw new IllegalArgumentException("Parameter is not associated with any method");
261261
}
262262

263-
var returnType = TypeInformation.fromReturnTypeOf(method);
263+
var returnType = TypeInformation.fromReturnTypeOf(method, parameter.getContainingClass());
264264
var unwrapped = QueryExecutionConverters.unwrapWrapperTypes(returnType);
265265
var reactiveUnwrapped = ReactiveWrapperConverters.unwrapWrapperTypes(unwrapped);
266266

src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolverSupport.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ private static TypeInformation<?> detectDomainType(MethodParameter parameter) {
146146
throw new IllegalArgumentException("Method parameter is not backed by a method");
147147
}
148148

149-
return detectDomainType(TypeInformation.fromReturnTypeOf(method));
149+
return detectDomainType(TypeInformation.fromReturnTypeOf(method, parameter.getContainingClass()));
150150
}
151151

152152
private static TypeInformation<?> detectDomainType(TypeInformation<?> source) {

src/test/java/org/springframework/data/repository/query/ParameterUnitTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323
import java.util.function.Function;
2424
import java.util.stream.Stream;
2525

26-
import org.jetbrains.annotations.NotNull;
2726
import org.junit.jupiter.api.DynamicTest;
2827
import org.junit.jupiter.api.Test;
2928
import org.junit.jupiter.api.TestFactory;
29+
3030
import org.springframework.core.MethodParameter;
3131
import org.springframework.data.repository.query.ParametersUnitTests.User;
3232
import org.springframework.data.util.TypeInformation;
@@ -85,7 +85,6 @@ void doesNotConsiderAtParamAnnotatedClassParameterDynamicProjectionOne() throws
8585
assertThat(parameter.isDynamicProjectionParameter()).isFalse();
8686
}
8787

88-
@NotNull
8988
private MethodParameter getMethodParameter(String methodName) throws NoSuchMethodException {
9089
return new MethodParameter(this.getClass().getDeclaredMethod(methodName, Class.class), 0);
9190
}
@@ -117,4 +116,5 @@ User staticReturnNonDynamicBindWildcardExtends(Class<? extends User> one) {
117116
<T> T atParamOnClass(@Param("type") Class<T> type) {
118117
return null;
119118
}
119+
120120
}

src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java

+18
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,16 @@ void detectsDynamicProjectionParameter() throws Exception {
159159
assertThat(parameters.getParameter(2).isDynamicProjectionParameter()).isFalse();
160160
}
161161

162+
@Test // GH-3020
163+
void detectsDynamicParametrizedProjectionParameter() throws Exception {
164+
165+
var method = ParametrizedRepository.class.getMethod("dynamicBind", Class.class);
166+
var parameters = new DefaultParameters(
167+
ParametersSource.of(new DefaultRepositoryMetadata(ParametrizedRepository.class), method));
168+
169+
assertThat(parameters.getParameter(0).isDynamicProjectionParameter()).isTrue();
170+
}
171+
162172
@Test // DATACMNS-863
163173
void unwrapsOptionals() throws Exception {
164174

@@ -272,4 +282,12 @@ interface Intermediate<T, ID> extends Repository<T, ID> {
272282

273283
interface TypedInterface extends Intermediate<User, Long> {}
274284

285+
interface GenericRepository<T, ID> extends Repository<T, ID> {
286+
<P extends Projection<T>> Optional<P> dynamicBind(Class<P> type);
287+
}
288+
289+
interface ParametrizedRepository extends GenericRepository<User, Long> {}
290+
291+
interface Projection<T> {}
292+
275293
}

0 commit comments

Comments
 (0)