diff --git a/src/main/java/it/aboutbits/springboot/toolbox/reflection/util/ClassScannerUtil.java b/src/main/java/it/aboutbits/springboot/toolbox/reflection/util/ClassScannerUtil.java index 8f8f52e..4aa3859 100644 --- a/src/main/java/it/aboutbits/springboot/toolbox/reflection/util/ClassScannerUtil.java +++ b/src/main/java/it/aboutbits/springboot/toolbox/reflection/util/ClassScannerUtil.java @@ -19,14 +19,20 @@ public static ClassScanner getScannerForPackages(String... packages) { public static final class ClassScanner implements AutoCloseable { private final ScanResult scanResult; + private final String[] packages; private ClassScanner(String... packages) { + this.packages = packages; this.scanResult = new ClassGraph() .enableAllInfo() .acceptPackages(packages) .scan(); } + public String[] getScannedPackages() { + return packages; + } + @SuppressWarnings("unchecked") public Set> getSubTypesOf(@NonNull Class clazz) { return scanResult.getClassesImplementing(clazz).loadClasses() diff --git a/src/main/java/it/aboutbits/springboot/toolbox/swagger/customization/force_schema/ForceSchemaCustomizer.java b/src/main/java/it/aboutbits/springboot/toolbox/swagger/customization/force_schema/ForceSchemaCustomizer.java index 38e5c83..6ea33e7 100644 --- a/src/main/java/it/aboutbits/springboot/toolbox/swagger/customization/force_schema/ForceSchemaCustomizer.java +++ b/src/main/java/it/aboutbits/springboot/toolbox/swagger/customization/force_schema/ForceSchemaCustomizer.java @@ -4,14 +4,18 @@ import io.swagger.v3.core.jackson.ModelResolver; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.media.Schema; import it.aboutbits.springboot.toolbox.reflection.util.ClassScannerUtil; import it.aboutbits.springboot.toolbox.swagger.annotation.ForceSwaggerSchema; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springdoc.core.customizers.OpenApiCustomizer; +import java.util.Arrays; import java.util.LinkedHashMap; @RequiredArgsConstructor +@Slf4j public class ForceSchemaCustomizer implements OpenApiCustomizer { private final ModelResolver modelResolver; private final ClassScannerUtil.ClassScanner classScanner; @@ -37,6 +41,26 @@ private void addAnnotatedSchemas(OpenAPI openAPI) { var annotatedClasses = classScanner.getClassesAnnotatedWith(ForceSwaggerSchema.class); for (var clazz : annotatedClasses) { + log.info("Forcing schema for class: {}", clazz.getName()); + + if (clazz.isEnum()) { + var fqn = clazz.getName(); + if (!openAPI.getComponents().getSchemas().containsKey(fqn)) { + var schema = new Schema(); + schema.name(fqn); + schema.setEnum( + Arrays.stream(clazz.getEnumConstants()) + .map(Object::toString) + .toList() + ); + schema.setType("string"); + schema.addType("string"); + + openAPI.getComponents().getSchemas().put(fqn, schema); + } + continue; + } + var schemas = customModelConverters.read(clazz); // Only add if not already present (to avoid overriding naturally discovered schemas) schemas.forEach((key, schema) -> { @@ -45,6 +69,11 @@ private void addAnnotatedSchemas(OpenAPI openAPI) { } }); } + + if (annotatedClasses.isEmpty()) { + log.info("No classes with @ForceSwaggerSchema annotation found!"); + log.debug("Scanned packages: {}", String.join(", ", classScanner.getScannedPackages())); + } } }