Skip to content

Commit d1fa854

Browse files
christophstroblschauder
authored andcommitted
Allow arguments to be used without creating a field.
See #3265
1 parent 47b8658 commit d1fa854

File tree

3 files changed

+65
-14
lines changed

3 files changed

+65
-14
lines changed

Diff for: src/main/java/org/springframework/data/repository/aot/generate/AotRepositoryBuilder.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.ArrayList;
2020
import java.util.Arrays;
2121
import java.util.Comparator;
22+
import java.util.LinkedHashMap;
2223
import java.util.List;
2324
import java.util.Map;
2425
import java.util.function.BiFunction;
@@ -29,10 +30,10 @@
2930
import org.apache.commons.logging.Log;
3031
import org.apache.commons.logging.LogFactory;
3132
import org.jspecify.annotations.Nullable;
32-
3333
import org.springframework.aot.generate.ClassNameGenerator;
3434
import org.springframework.aot.generate.Generated;
3535
import org.springframework.data.projection.ProjectionFactory;
36+
import org.springframework.data.repository.aot.generate.AotRepositoryFragmentMetadata.ConstructorArgument;
3637
import org.springframework.data.repository.aot.generate.json.JSONException;
3738
import org.springframework.data.repository.aot.generate.json.JSONObject;
3839
import org.springframework.data.repository.core.RepositoryInformation;
@@ -215,7 +216,11 @@ private String typeName() {
215216
}
216217

217218
public Map<String, TypeName> getAutowireFields() {
218-
return generationMetadata.getConstructorArguments();
219+
Map<String, TypeName> autowireFields = new LinkedHashMap<>(generationMetadata.getConstructorArguments().size());
220+
for (Map.Entry<String, ConstructorArgument> entry : generationMetadata.getConstructorArguments().entrySet()) {
221+
autowireFields.put(entry.getKey(), entry.getValue().getTypeName());
222+
}
223+
return autowireFields;
219224
}
220225

221226
public RepositoryInformation getRepositoryInformation() {
@@ -238,8 +243,7 @@ public interface ClassCustomizer {
238243
* @param metadata
239244
* @param builder
240245
*/
241-
void customize(RepositoryInformation information, AotRepositoryFragmentMetadata metadata,
242-
TypeSpec.Builder builder);
246+
void customize(RepositoryInformation information, AotRepositoryFragmentMetadata metadata, TypeSpec.Builder builder);
243247

244248
}
245249

Diff for: src/main/java/org/springframework/data/repository/aot/generate/AotRepositoryConstructorBuilder.java

+22-7
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import javax.lang.model.element.Modifier;
2222

2323
import org.springframework.core.ResolvableType;
24+
import org.springframework.data.repository.aot.generate.AotRepositoryFragmentMetadata.ConstructorArgument;
2425
import org.springframework.data.repository.core.RepositoryInformation;
2526
import org.springframework.javapoet.MethodSpec;
2627
import org.springframework.javapoet.ParameterizedTypeName;
@@ -64,15 +65,27 @@ public void addParameter(String parameterName, Class<?> type) {
6465
}
6566

6667
/**
67-
* Add constructor parameter.
68+
* Add constructor parameter and create a field for it.
6869
*
6970
* @param parameterName
7071
* @param type
7172
*/
7273
public void addParameter(String parameterName, TypeName type) {
74+
addParameter(parameterName, type, true);
75+
}
7376

74-
this.metadata.addConstructorArgument(parameterName, type);
75-
this.metadata.addField(parameterName, type, Modifier.PRIVATE, Modifier.FINAL);
77+
/**
78+
* Add constructor parameter.
79+
*
80+
* @param parameterName
81+
* @param type
82+
*/
83+
public void addParameter(String parameterName, TypeName type, boolean createField) {
84+
85+
this.metadata.addConstructorArgument(parameterName, type, createField ? parameterName : null);
86+
if(createField) {
87+
this.metadata.addField(parameterName, type, Modifier.PRIVATE, Modifier.FINAL);
88+
}
7689
}
7790

7891
/**
@@ -89,15 +102,17 @@ MethodSpec buildConstructor() {
89102

90103
MethodSpec.Builder builder = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC);
91104

92-
for (Entry<String, TypeName> parameter : this.metadata.getConstructorArguments().entrySet()) {
93-
builder.addParameter(parameter.getValue(), parameter.getKey());
105+
for (Entry<String, ConstructorArgument> parameter : this.metadata.getConstructorArguments().entrySet()) {
106+
builder.addParameter(parameter.getValue().getTypeName(), parameter.getKey());
94107
}
95108

96109
customizer.customize(repositoryInformation, builder);
97110

98-
for (Entry<String, TypeName> parameter : this.metadata.getConstructorArguments().entrySet()) {
99-
builder.addStatement("this.$N = $N", parameter.getKey(),
111+
for (Entry<String, ConstructorArgument> parameter : this.metadata.getConstructorArguments().entrySet()) {
112+
if(parameter.getValue().isForLocalField()) {
113+
builder.addStatement("this.$N = $N", parameter.getKey(),
100114
parameter.getKey());
115+
}
101116
}
102117

103118
return builder.build();

Diff for: src/main/java/org/springframework/data/repository/aot/generate/AotRepositoryFragmentMetadata.java

+35-3
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class AotRepositoryFragmentMetadata {
3535

3636
private final ClassName className;
3737
private final Map<String, FieldSpec> fields = new HashMap<>(3);
38-
private final Map<String, TypeName> constructorArguments = new LinkedHashMap<>(3);
38+
private final Map<String, ConstructorArgument> constructorArguments = new LinkedHashMap<>(3);
3939

4040
public AotRepositoryFragmentMetadata(ClassName className) {
4141
this.className = className;
@@ -82,11 +82,43 @@ Map<String, FieldSpec> getFields() {
8282
return fields;
8383
}
8484

85-
public Map<String, TypeName> getConstructorArguments() {
85+
public Map<String, ConstructorArgument> getConstructorArguments() {
8686
return constructorArguments;
8787
}
8888

8989
public void addConstructorArgument(String parameterName, TypeName type) {
90-
this.constructorArguments.put(parameterName, type);
90+
addConstructorArgument(parameterName, type, parameterName);
91+
}
92+
93+
public void addConstructorArgument(String parameterName, TypeName type, @Nullable String fieldName) {
94+
this.constructorArguments.put(parameterName, new ConstructorArgument(parameterName, type, fieldName));
95+
}
96+
97+
static class ConstructorArgument {
98+
String parameterName;
99+
@Nullable String fieldName;
100+
TypeName typeName;
101+
102+
public ConstructorArgument(String parameterName,TypeName typeName, String fieldName) {
103+
this.parameterName = parameterName;
104+
this.fieldName = fieldName;
105+
this.typeName = typeName;
106+
}
107+
108+
boolean isForLocalField() {
109+
return fieldName != null;
110+
}
111+
112+
public String getParameterName() {
113+
return parameterName;
114+
}
115+
116+
public String getFieldName() {
117+
return fieldName;
118+
}
119+
120+
public TypeName getTypeName() {
121+
return typeName;
122+
}
91123
}
92124
}

0 commit comments

Comments
 (0)