20
20
import org .apache .commons .logging .Log ;
21
21
import org .apache .commons .logging .LogFactory ;
22
22
import org .jspecify .annotations .Nullable ;
23
+
23
24
import org .springframework .aot .generate .GeneratedClass ;
24
25
import org .springframework .aot .generate .GeneratedTypeReference ;
25
26
import org .springframework .aot .generate .GenerationContext ;
31
32
import org .springframework .data .repository .config .AotRepositoryContext ;
32
33
import org .springframework .data .repository .core .RepositoryInformation ;
33
34
import org .springframework .data .repository .query .QueryMethod ;
34
- import org .springframework .javapoet .ClassName ;
35
35
import org .springframework .javapoet .TypeName ;
36
36
37
37
/**
@@ -46,8 +46,7 @@ public class RepositoryContributor {
46
46
private static final Log logger = LogFactory .getLog (RepositoryContributor .class );
47
47
private static final String FEATURE_NAME = "AotRepository" ;
48
48
49
- private AotRepositoryBuilder builder ;
50
- private final AotRepositoryContext repositoryContext ;
49
+ private final AotRepositoryBuilder builder ;
51
50
private @ Nullable TypeReference contributedTypeName ;
52
51
53
52
/**
@@ -57,7 +56,6 @@ public class RepositoryContributor {
57
56
*/
58
57
public RepositoryContributor (AotRepositoryContext repositoryContext ) {
59
58
60
- this .repositoryContext = repositoryContext ;
61
59
builder = AotRepositoryBuilder .forRepository (repositoryContext .getRepositoryInformation (),
62
60
repositoryContext .getModuleName (), createProjectionFactory ());
63
61
}
@@ -98,39 +96,45 @@ public void contribute(GenerationContext generationContext) {
98
96
.withConstructorCustomizer (this ::customizeConstructor ) //
99
97
.withQueryMethodContributor (this ::contributeQueryMethod ); //
100
98
99
+ // TODO: temporary fix until we have a better representation of constructor arguments
100
+ // decouple the description of arguments from the actual code used in the constructor initialization, super calls,
101
+ // etc.
102
+ RepositoryConstructorBuilder constructorBuilder = new RepositoryConstructorBuilder (builder .getGenerationMetadata ());
103
+ customizeConstructor (constructorBuilder );
104
+
101
105
GeneratedClass generatedClass = generationContext .getGeneratedClasses ().getOrAddForFeatureComponent (FEATURE_NAME ,
102
- ClassName .bestGuess (builder .intendedTargetClassName ().getCanonicalName ()), targetTypeSpec -> {
106
+ builder .getClassName (), targetTypeSpec -> {
107
+
108
+ // capture the actual type name early on so that we can use it in the constructor.
109
+ builder .withClassName (targetTypeSpec .build ().name ());
103
110
104
111
AotBundle aotBundle = builder .build (targetTypeSpec );
105
- {
106
- Class <?> repositoryInterface = getRepositoryInformation ().getRepositoryInterface ();
107
- String repositoryJsonFileName = getRepositoryJsonFileName (repositoryInterface );
108
- String repositoryJson ;
109
- try {
110
- repositoryJson = aotBundle .metadata ().toJson ().toString (2 );
111
- } catch (JSONException e ) {
112
- throw new RuntimeException (e );
113
- }
114
-
115
- if (logger .isTraceEnabled ()) {
116
- logger .trace ("""
117
- ------ AOT Repository.json: %s ------
118
- %s
119
- -------------------
120
- """ .formatted (repositoryJsonFileName , repositoryJson ));
121
-
122
- logger .trace ("""
123
- ------ AOT Generated Repository: %s ------
124
- %s
125
- -------------------
126
- """ .formatted (null , aotBundle .javaFile ()));
127
- }
128
-
129
- generationContext .getGeneratedFiles ().addResourceFile (repositoryJsonFileName , repositoryJson );
112
+ Class <?> repositoryInterface = getRepositoryInformation ().getRepositoryInterface ();
113
+ String repositoryJsonFileName = getRepositoryJsonFileName (repositoryInterface );
114
+ String repositoryJson ;
115
+ try {
116
+ repositoryJson = aotBundle .metadata ().toJson ().toString (2 );
117
+ } catch (JSONException e ) {
118
+ throw new RuntimeException (e );
130
119
}
120
+
121
+ if (logger .isTraceEnabled ()) {
122
+ logger .trace ("""
123
+ ------ AOT Repository.json: %s ------
124
+ %s
125
+ -------------------
126
+ """ .formatted (repositoryJsonFileName , repositoryJson ));
127
+
128
+ logger .trace ("""
129
+ ------ AOT Generated Repository: %s ------
130
+ %s
131
+ -------------------
132
+ """ .formatted (null , aotBundle .javaFile ()));
133
+ }
134
+
135
+ generationContext .getGeneratedFiles ().addResourceFile (repositoryJsonFileName , repositoryJson );
131
136
});
132
137
133
- builder .prepare (generatedClass .getName ()); // initialize ctor argument resolution and set type name to target
134
138
this .contributedTypeName = GeneratedTypeReference .of (generatedClass .getName ());
135
139
136
140
// generate native runtime hints - needed cause we're using the repository proxy
0 commit comments