diff --git a/sprout-annotations/pom.xml b/sprout-annotations/pom.xml index 07c7ca9..11fb9b4 100644 --- a/sprout-annotations/pom.xml +++ b/sprout-annotations/pom.xml @@ -44,6 +44,10 @@ + + org.springframework.boot + spring-boot-starter + jakarta.persistence jakarta.persistence-api @@ -55,6 +59,10 @@ javax.persistence-api 2.2 + + org.springframework.data + spring-data-commons + diff --git a/sprout-annotations/src/main/java/de/flix29/sprout/annotations/SproutResource.java b/sprout-annotations/src/main/java/de/flix29/sprout/annotations/SproutResource.java index b1d1312..3f09214 100644 --- a/sprout-annotations/src/main/java/de/flix29/sprout/annotations/SproutResource.java +++ b/sprout-annotations/src/main/java/de/flix29/sprout/annotations/SproutResource.java @@ -35,7 +35,7 @@ /** * If true, only read endpoints are generated for this resource. Note that this overrides the * {@link SproutResource#include()} and {@link SproutResource#exclude()} options.
- * e.g., if set to true, no create, update, or delete endpoints will be generated. + * E.g., if set to true, no create, update, or delete endpoints will be generated. * No matter what is set in include/exclude. You can still exclude read endpoints * using {@link SproutResource#exclude()}. * @return true if the resource is read-only @@ -61,6 +61,14 @@ */ boolean generateSwaggerDocs() default true; + /** + * If true, the generated Repository will be annotated with + * {@link org.springframework.data.repository.NoRepositoryBean}. By default, the repository is annotated with + * {@link org.springframework.stereotype.Repository}. + * @return true if the repository should be overridable. + */ + boolean overrideRepository() default false; + /** * Optional tag for the resource. This will be used in the Swagger documentation if enabled. * @return the resource tag diff --git a/sprout-processor/src/main/java/de/flix29/sprout/processor/SproutProcessor.java b/sprout-processor/src/main/java/de/flix29/sprout/processor/SproutProcessor.java index a8dc8ba..4faa2f4 100644 --- a/sprout-processor/src/main/java/de/flix29/sprout/processor/SproutProcessor.java +++ b/sprout-processor/src/main/java/de/flix29/sprout/processor/SproutProcessor.java @@ -114,7 +114,8 @@ public boolean process(Set annotations, RoundEnvironment Diagnostic.Kind.NOTE, "[Sprout] Generating repository for " + simpleName ); - var repository = SproutRepositoryGenerator.generateRepository(type, simpleName, entityName, idName, idType); + var repository = SproutRepositoryGenerator + .generateRepository(type, simpleName, entityName, idName, annotation.overrideRepository(), idType); processingEnv.getMessager().printMessage( Diagnostic.Kind.NOTE, diff --git a/sprout-processor/src/main/java/de/flix29/sprout/processor/SproutRepositoryGenerator.java b/sprout-processor/src/main/java/de/flix29/sprout/processor/SproutRepositoryGenerator.java index f96a31d..5ef1890 100644 --- a/sprout-processor/src/main/java/de/flix29/sprout/processor/SproutRepositoryGenerator.java +++ b/sprout-processor/src/main/java/de/flix29/sprout/processor/SproutRepositoryGenerator.java @@ -27,17 +27,29 @@ private SproutRepositoryGenerator() { } public static TypeSpec.Builder generateRepository( - TypeElement type, String simpleName, String entityName, String idName, TypeMirror idType + TypeElement type, + String simpleName, + String entityName, + String idName, + boolean overrideRepository, + TypeMirror idType ) { - return TypeSpec.interfaceBuilder("Sprout" + simpleName + "Repository") + var builder = TypeSpec.interfaceBuilder("Sprout" + simpleName + "Repository") .addModifiers(Modifier.PUBLIC) - .addAnnotation(ClassName.get("org.springframework.stereotype", "Repository")) .addSuperinterface(ParameterizedTypeName.get( ClassName.get(SPRING_DATA_JPA, "JpaRepository"), ClassName.get(type), TypeName.get(idType) )) .addMethod(generateDeleteByIdMethod(entityName, idName, TypeName.get(idType))); + + if (overrideRepository) { + builder.addAnnotation(ClassName.get("org.springframework.data.repository", "NoRepositoryBean")); + } else { + builder.addAnnotation(ClassName.get("org.springframework.stereotype", "Repository")); + } + + return builder; } private static MethodSpec generateDeleteByIdMethod(String entityName, String idName, TypeName idType) {