Skip to content

Commit 89fa0d6

Browse files
authored
Merge pull request #37 from aboutbits/fix-schema-forcing-for-enums
fix swagger schema forcing for enums
2 parents d02baab + db94a1c commit 89fa0d6

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

src/main/java/it/aboutbits/springboot/toolbox/reflection/util/ClassScannerUtil.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,20 @@ public static ClassScanner getScannerForPackages(String... packages) {
1919

2020
public static final class ClassScanner implements AutoCloseable {
2121
private final ScanResult scanResult;
22+
private final String[] packages;
2223

2324
private ClassScanner(String... packages) {
25+
this.packages = packages;
2426
this.scanResult = new ClassGraph()
2527
.enableAllInfo()
2628
.acceptPackages(packages)
2729
.scan();
2830
}
2931

32+
public String[] getScannedPackages() {
33+
return packages;
34+
}
35+
3036
@SuppressWarnings("unchecked")
3137
public <T> Set<Class<? extends T>> getSubTypesOf(@NonNull Class<T> clazz) {
3238
return scanResult.getClassesImplementing(clazz).loadClasses()

src/main/java/it/aboutbits/springboot/toolbox/swagger/customization/force_schema/ForceSchemaCustomizer.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@
44
import io.swagger.v3.core.jackson.ModelResolver;
55
import io.swagger.v3.oas.models.Components;
66
import io.swagger.v3.oas.models.OpenAPI;
7+
import io.swagger.v3.oas.models.media.Schema;
78
import it.aboutbits.springboot.toolbox.reflection.util.ClassScannerUtil;
89
import it.aboutbits.springboot.toolbox.swagger.annotation.ForceSwaggerSchema;
910
import lombok.RequiredArgsConstructor;
11+
import lombok.extern.slf4j.Slf4j;
1012
import org.springdoc.core.customizers.OpenApiCustomizer;
1113

14+
import java.util.Arrays;
1215
import java.util.LinkedHashMap;
1316

1417
@RequiredArgsConstructor
18+
@Slf4j
1519
public class ForceSchemaCustomizer implements OpenApiCustomizer {
1620
private final ModelResolver modelResolver;
1721
private final ClassScannerUtil.ClassScanner classScanner;
@@ -37,6 +41,26 @@ private void addAnnotatedSchemas(OpenAPI openAPI) {
3741
var annotatedClasses = classScanner.getClassesAnnotatedWith(ForceSwaggerSchema.class);
3842

3943
for (var clazz : annotatedClasses) {
44+
log.info("Forcing schema for class: {}", clazz.getName());
45+
46+
if (clazz.isEnum()) {
47+
var fqn = clazz.getName();
48+
if (!openAPI.getComponents().getSchemas().containsKey(fqn)) {
49+
var schema = new Schema<String>();
50+
schema.name(fqn);
51+
schema.setEnum(
52+
Arrays.stream(clazz.getEnumConstants())
53+
.map(Object::toString)
54+
.toList()
55+
);
56+
schema.setType("string");
57+
schema.addType("string");
58+
59+
openAPI.getComponents().getSchemas().put(fqn, schema);
60+
}
61+
continue;
62+
}
63+
4064
var schemas = customModelConverters.read(clazz);
4165
// Only add if not already present (to avoid overriding naturally discovered schemas)
4266
schemas.forEach((key, schema) -> {
@@ -45,6 +69,11 @@ private void addAnnotatedSchemas(OpenAPI openAPI) {
4569
}
4670
});
4771
}
72+
73+
if (annotatedClasses.isEmpty()) {
74+
log.info("No classes with @ForceSwaggerSchema annotation found!");
75+
log.debug("Scanned packages: {}", String.join(", ", classScanner.getScannedPackages()));
76+
}
4877
}
4978
}
5079

0 commit comments

Comments
 (0)