Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 857ccce

Browse files
committed
Add support for ConfigurationSource and Dynamic Projections.
See: #3279 Original Pull Request: #3289
1 parent 368fe71 commit 857ccce

15 files changed

+156
-44
lines changed

‎pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@
381381
</profiles>
382382

383383
<repositories>
384-
<repository>
384+
<repository>
385385
<id>spring-snapshot</id>
386386
<url>https://repo.spring.io/snapshot</url>
387387
<snapshots>

‎src/main/java/org/springframework/data/repository/aot/generate/AotQueryMethodGenerationContext.java‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,4 +293,22 @@ public String getLimitParameterName() {
293293
return getParameterName(queryMethod.getParameters().getLimitIndex());
294294
}
295295

296+
/**
297+
* @return the parameter name for the {@link org.springframework.data.domain.ScrollPosition scroll position parameter}
298+
* or {@code null} if the method does not declare a scroll position parameter.
299+
*/
300+
@Nullable
301+
public String getScrollPositionParameterName() {
302+
return getParameterName(queryMethod.getParameters().getScrollPositionIndex());
303+
}
304+
305+
/**
306+
* @return the parameter name for the {@link Class dynamic projection parameter} or {@code null} if the method does
307+
* not declare a dynamic projection parameter.
308+
*/
309+
@Nullable
310+
public String getDynamicProjectionParameterName() {
311+
return getParameterName(queryMethod.getParameters().getDynamicProjectionIndex());
312+
}
313+
296314
}

‎src/main/java/org/springframework/data/repository/aot/generate/MethodMetadata.java‎

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,25 @@ class MethodMetadata {
4848
MethodMetadata(RepositoryInformation repositoryInformation, Method method) {
4949

5050
this.returnType = repositoryInformation.getReturnType(method).toResolvableType();
51-
this.actualReturnType = ResolvableType.forType(repositoryInformation.getReturnedDomainClass(method));
51+
this.actualReturnType = repositoryInformation.getReturnedDomainTypeInformation(method).toResolvableType();
5252
this.initParameters(repositoryInformation, method, new DefaultParameterNameDiscoverer());
5353
}
5454

55-
@Nullable
56-
public String getParameterNameOf(Class<?> type) {
57-
for (Entry<String, ParameterSpec> entry : methodArguments.entrySet()) {
58-
if (entry.getValue().type.equals(TypeName.get(type))) {
59-
return entry.getKey();
60-
}
55+
private void initParameters(RepositoryInformation repositoryInformation, Method method,
56+
ParameterNameDiscoverer nameDiscoverer) {
57+
58+
ResolvableType repositoryInterface = ResolvableType.forClass(repositoryInformation.getRepositoryInterface());
59+
60+
for (java.lang.reflect.Parameter parameter : method.getParameters()) {
61+
62+
MethodParameter methodParameter = MethodParameter.forParameter(parameter);
63+
methodParameter.initParameterNameDiscovery(nameDiscoverer);
64+
ResolvableType resolvableParameterType = ResolvableType.forMethodParameter(methodParameter, repositoryInterface);
65+
66+
TypeName parameterType = TypeName.get(resolvableParameterType.getType());
67+
68+
addParameter(ParameterSpec.builder(parameterType, methodParameter.getParameterName()).build());
6169
}
62-
return null;
6370
}
6471

6572
ResolvableType getReturnType() {
@@ -96,20 +103,4 @@ Map<String, String> getLocalVariables() {
96103
return localVariables;
97104
}
98105

99-
private void initParameters(RepositoryInformation repositoryInformation, Method method,
100-
ParameterNameDiscoverer nameDiscoverer) {
101-
102-
ResolvableType repositoryInterface = ResolvableType.forClass(repositoryInformation.getRepositoryInterface());
103-
104-
for (java.lang.reflect.Parameter parameter : method.getParameters()) {
105-
106-
MethodParameter methodParameter = MethodParameter.forParameter(parameter);
107-
methodParameter.initParameterNameDiscovery(nameDiscoverer);
108-
ResolvableType resolvableParameterType = ResolvableType.forMethodParameter(methodParameter, repositoryInterface);
109-
110-
TypeName parameterType = TypeName.get(resolvableParameterType.getType());
111-
112-
addParameter(ParameterSpec.builder(parameterType, methodParameter.getParameterName()).build());
113-
}
114-
}
115106
}

‎src/main/java/org/springframework/data/repository/config/AotRepositoryContext.java‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,17 @@ public interface AotRepositoryContext extends AotContext {
4545
*/
4646
String getModuleName();
4747

48+
/**
49+
* @return the repository configuration source.
50+
*/
51+
RepositoryConfigurationSource getConfigurationSource();
52+
4853
/**
4954
* @return a {@link Set} of {@link String base packages} to search for repositories.
5055
*/
51-
Set<String> getBasePackages();
56+
default Set<String> getBasePackages() {
57+
return getConfigurationSource().getBasePackages().toSet();
58+
}
5259

5360
/**
5461
* @return the {@link Annotation} types used to identify domain types.

‎src/main/java/org/springframework/data/repository/config/DefaultAotRepositoryContext.java‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class DefaultAotRepositoryContext implements AotRepositoryContext {
4646

4747
private final RegisteredBean bean;
4848
private final String moduleName;
49+
private final RepositoryConfigurationSource configurationSource;
4950
private final AotContext aotContext;
5051
private final RepositoryInformation repositoryInformation;
5152
private final Lazy<Set<MergedAnnotation<Annotation>>> resolvedAnnotations = Lazy.of(this::discoverAnnotations);
@@ -56,12 +57,14 @@ class DefaultAotRepositoryContext implements AotRepositoryContext {
5657
private String beanName;
5758

5859
public DefaultAotRepositoryContext(RegisteredBean bean, RepositoryInformation repositoryInformation,
59-
String moduleName, AotContext aotContext) {
60+
String moduleName, AotContext aotContext, RepositoryConfigurationSourceconfigurationSource) {
6061
this.bean = bean;
6162
this.repositoryInformation = repositoryInformation;
6263
this.moduleName = moduleName;
64+
this.configurationSource = configurationSource;
6365
this.aotContext = aotContext;
6466
this.beanName = bean.getBeanName();
67+
this.basePackages = configurationSource.getBasePackages().toSet();
6568
}
6669

6770
public AotContext getAotContext() {
@@ -73,6 +76,11 @@ public String getModuleName() {
7376
return moduleName;
7477
}
7578

79+
@Override
80+
public RepositoryConfigurationSource getConfigurationSource() {
81+
return configurationSource;
82+
}
83+
7684
@Override
7785
public ConfigurableListableBeanFactory getBeanFactory() {
7886
return getAotContext().getBeanFactory();

‎src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotContribution.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,9 @@ private void logTrace(String message, Object... arguments) {
194194
}
195195
RepositoryInformation repositoryInformation = reader.getRepositoryInformation();
196196
DefaultAotRepositoryContext repositoryContext = new DefaultAotRepositoryContext(bean, repositoryInformation,
197-
extension.getModuleName(), AotContext.from(bean.getBeanFactory(), environment));
197+
extension.getModuleName(), AotContext.from(bean.getBeanFactory(), environment),
198+
configuration.getConfigurationSource());
198199

199-
repositoryContext.setBasePackages(repositoryConfiguration.getBasePackages().toSet());
200200
repositoryContext.setIdentifyingAnnotations(extension.getIdentifyingAnnotations());
201201

202202
return repositoryContext;

‎src/main/java/org/springframework/data/repository/core/RepositoryInformationSupport.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ public Class<?> getReturnedDomainClass(Method method) {
8989
return getMetadata().getReturnedDomainClass(method);
9090
}
9191

92+
@Override
93+
public TypeInformation<?> getReturnedDomainTypeInformation(Method method) {
94+
return getMetadata().getReturnedDomainTypeInformation(method);
95+
}
96+
9297
@Override
9398
public CrudMethods getCrudMethods() {
9499
return getMetadata().getCrudMethods();

‎src/main/java/org/springframework/data/repository/core/RepositoryMetadata.java‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,26 @@ default Class<?> getDomainType() {
9191
*
9292
* @param method
9393
* @return
94+
* @see #getReturnedDomainTypeInformation(Method)
9495
* @see #getReturnType(Method)
9596
*/
9697
Class<?> getReturnedDomainClass(Method method);
9798

99+
/**
100+
* Returns the domain type information returned by the given {@link Method}. In contrast to
101+
* {@link #getReturnType(Method)}, this method extracts the type from {@link Collection}s and
102+
* {@link org.springframework.data.domain.Page} as well.
103+
*
104+
* @param method
105+
* @return
106+
* @see #getReturnedDomainClass(Method)
107+
* @see #getReturnType(Method)
108+
* @since 4.0
109+
*/
110+
default TypeInformation<?> getReturnedDomainTypeInformation(Method method) {
111+
return TypeInformation.of(getReturnedDomainClass(method));
112+
}
113+
98114
/**
99115
* Returns {@link CrudMethods} meta information for the repository.
100116
*

‎src/main/java/org/springframework/data/repository/core/support/AbstractRepositoryMetadata.java‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,16 @@ public TypeInformation<?> getReturnType(Method method) {
100100

101101
@Override
102102
public Class<?> getReturnedDomainClass(Method method) {
103+
return getReturnedDomainTypeInformation(method).getType();
104+
}
105+
106+
@Override
107+
public TypeInformation<?> getReturnedDomainTypeInformation(Method method) {
103108

104109
TypeInformation<?> returnType = getReturnType(method);
105110
returnType = ReactiveWrapperConverters.unwrapWrapperTypes(returnType);
106111

107-
return QueryExecutionConverters.unwrapWrapperTypes(returnType, getDomainTypeInformation()).getType();
112+
return QueryExecutionConverters.unwrapWrapperTypes(returnType, getDomainTypeInformation());
108113
}
109114

110115
@Override

‎src/main/java/org/springframework/data/repository/query/QueryMethod.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,8 @@ private static void assertReturnTypeAssignable(Method method, Set<Class<?>> type
403403
}
404404
}
405405

406-
throw new IllegalStateException("Method has to have one of the following return types " + types);
406+
throw new IllegalStateException(
407+
"Method '%s' has to have one of the following return types: %s".formatted(method, types));
407408
}
408409

409410
static class QueryMethodValidator {

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /