Skip to content

Commit f429bb2

Browse files
authored
Various improvements to schema binding (#745)
* Fix lost schema example param * Improve test for OpenAPIDefinition * Test Schema example * Kotlin 1.7.0 * Fix lost default schema field * Fix lost properties, when schema used on property level. Fixed lost default value ehn schema used on class level. Add rename property feature by schema name
1 parent 12a6417 commit f429bb2

6 files changed

Lines changed: 637 additions & 25 deletions

File tree

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
managed-swagger = "2.2.0"
33

44
kotlintest-runner-junit5 = "3.4.2"
5-
kotlin = "1.6.21"
5+
kotlin = "1.7.0"
66

77
[libraries]
88
managed-swagger-annotations = { module = "io.swagger.core.v3:swagger-annotations", version.ref = "managed-swagger" }

openapi/src/main/java/io/micronaut/openapi/visitor/AbstractOpenApiVisitor.java

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,10 @@ protected <T> T treeToValue(JsonNode jn, Class<T> clazz) throws JsonProcessingEx
375375
T value = jsonMapper.treeToValue(jn, clazz);
376376
if (value != null) {
377377
resolveExtensions(jn).ifPresent(extensions -> BeanMap.of(value).put("extensions", extensions));
378+
// fix for default value
379+
if (jn.has("defaultValue")) {
380+
BeanMap.of(value).put("default", jsonMapper.treeToValue(jn.get("defaultValue"), Map.class));
381+
}
378382
}
379383
return value;
380384
}
@@ -949,6 +953,9 @@ private void addProperty(Schema parentSchema, String name, Schema propertySchema
949953
private String resolvePropertyName(Element element, Element classElement, Schema propertySchema) {
950954
String name = Optional.ofNullable(propertySchema.getName()).orElse(element.getName());
951955

956+
if (element.hasAnnotation(io.swagger.v3.oas.annotations.media.Schema.class)) {
957+
return element.stringValue(io.swagger.v3.oas.annotations.media.Schema.class, "name").orElse(name);
958+
}
952959
if (element.hasAnnotation(JsonProperty.class)) {
953960
return element.stringValue(JsonProperty.class, "value").orElse(name);
954961
}
@@ -992,6 +999,96 @@ protected Schema bindSchemaForElement(VisitorContext context, Element element, C
992999
if (schemaDescription.isPresent()) {
9931000
schemaToBind.setDescription(schemaDescription.get());
9941001
}
1002+
Optional<String> schemaFormat = schemaAnn.get("format", String.class);
1003+
if (schemaFormat.isPresent()) {
1004+
schemaToBind.setFormat(schemaFormat.get());
1005+
}
1006+
Optional<String> schemaTitle = schemaAnn.get("title", String.class);
1007+
if (schemaTitle.isPresent()) {
1008+
schemaToBind.setTitle(schemaTitle.get());
1009+
}
1010+
Optional<BigDecimal> schemaMinimum = schemaAnn.get("minimum", BigDecimal.class);
1011+
if (schemaMinimum.isPresent()) {
1012+
schemaToBind.setMinimum(schemaMinimum.get());
1013+
}
1014+
Optional<BigDecimal> schemaMaximum = schemaAnn.get("maximum", BigDecimal.class);
1015+
if (schemaMaximum.isPresent()) {
1016+
schemaToBind.setMaximum(schemaMaximum.get());
1017+
}
1018+
Optional<Boolean> schemaExclusiveMinimum = schemaAnn.get("exclusiveMinimum", Boolean.class);
1019+
if (schemaExclusiveMinimum.isPresent()) {
1020+
schemaToBind.setExclusiveMinimum(schemaExclusiveMinimum.get());
1021+
}
1022+
Optional<Boolean> schemaExclusiveMaximum = schemaAnn.get("exclusiveMaximum", Boolean.class);
1023+
if (schemaExclusiveMaximum.isPresent()) {
1024+
schemaToBind.setExclusiveMaximum(schemaExclusiveMaximum.get());
1025+
}
1026+
Optional<Integer> schemaMinLength = schemaAnn.get("minLength", Integer.class);
1027+
if (schemaMinLength.isPresent()) {
1028+
schemaToBind.setMinLength(schemaMinLength.get());
1029+
}
1030+
Optional<Integer> schemaMaxLength = schemaAnn.get("maxLength", Integer.class);
1031+
if (schemaMaxLength.isPresent()) {
1032+
schemaToBind.setMaxLength(schemaMaxLength.get());
1033+
}
1034+
Optional<Integer> schemaMinProperties = schemaAnn.get("minProperties", Integer.class);
1035+
if (schemaMinProperties.isPresent()) {
1036+
schemaToBind.setMinProperties(schemaMinProperties.get());
1037+
}
1038+
Optional<Integer> schemaMaxProperties = schemaAnn.get("maxProperties", Integer.class);
1039+
if (schemaMaxProperties.isPresent()) {
1040+
schemaToBind.setMaxProperties(schemaMaxProperties.get());
1041+
}
1042+
Optional<BigDecimal> schemaMultipleOf = schemaAnn.get("multipleOf", BigDecimal.class);
1043+
if (schemaMultipleOf.isPresent()) {
1044+
schemaToBind.setMultipleOf(schemaMultipleOf.get());
1045+
}
1046+
Optional<String> schemaPattern = schemaAnn.get("pattern", String.class);
1047+
if (schemaPattern.isPresent()) {
1048+
schemaToBind.setPattern(schemaPattern.get());
1049+
}
1050+
1051+
Optional<AnnotationValue<io.swagger.v3.oas.annotations.ExternalDocumentation>> schemaExtDocs = schemaAnn.getAnnotation("externalDocs", io.swagger.v3.oas.annotations.ExternalDocumentation.class);
1052+
ExternalDocumentation externalDocs = null;
1053+
if (schemaExtDocs.isPresent()) {
1054+
externalDocs = toValue(schemaExtDocs.get().getValues(), context, ExternalDocumentation.class).orElse(null);
1055+
}
1056+
if (externalDocs != null) {
1057+
schemaToBind.setExternalDocs(externalDocs);
1058+
}
1059+
Optional<String> schemaDefaultValue = schemaAnn.get("defaultValue", String.class);
1060+
if (schemaDefaultValue.isPresent()) {
1061+
try {
1062+
schemaToBind.setDefault(jsonMapper.readValue(schemaDefaultValue.get(), Map.class));
1063+
} catch (JsonProcessingException e) {
1064+
schemaToBind.setDefault(schemaDefaultValue.get());
1065+
}
1066+
}
1067+
Optional<String> schemaExample = schemaAnn.get("example", String.class);
1068+
if (schemaExample.isPresent()) {
1069+
try {
1070+
schemaToBind.setExample(jsonMapper.readValue(schemaExample.get(), Map.class));
1071+
} catch (JsonProcessingException e) {
1072+
schemaToBind.setExample(schemaExample.get());
1073+
}
1074+
}
1075+
Optional<Boolean> schemaDeprecated = schemaAnn.get("deprecated", Boolean.class);
1076+
if (schemaDeprecated.isPresent()) {
1077+
schemaToBind.setDeprecated(schemaDeprecated.get());
1078+
}
1079+
Optional<io.swagger.v3.oas.annotations.media.Schema.AccessMode> schemaAccessMode = schemaAnn.get("accessMode", io.swagger.v3.oas.annotations.media.Schema.AccessMode.class);
1080+
if (schemaAccessMode.isPresent()) {
1081+
if (schemaAccessMode.get() == io.swagger.v3.oas.annotations.media.Schema.AccessMode.READ_ONLY) {
1082+
schemaToBind.setReadOnly(true);
1083+
schemaToBind.setWriteOnly(null);
1084+
} else if (schemaAccessMode.get() == io.swagger.v3.oas.annotations.media.Schema.AccessMode.WRITE_ONLY) {
1085+
schemaToBind.setReadOnly(false);
1086+
schemaToBind.setWriteOnly(null);
1087+
} else if (schemaAccessMode.get() == io.swagger.v3.oas.annotations.media.Schema.AccessMode.READ_WRITE) {
1088+
schemaToBind.setReadOnly(null);
1089+
schemaToBind.setWriteOnly(null);
1090+
}
1091+
}
9951092
}
9961093
}
9971094
if (originalSchema.get$ref() == null && schemaAnn != null) {

0 commit comments

Comments
 (0)