Skip to content

Commit 08063c6

Browse files
refactor: add DiscriminatorUtils for handling discriminator properties in schemas
1 parent 6f799ee commit 08063c6

2 files changed

Lines changed: 77 additions & 48 deletions

File tree

modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java

Lines changed: 2 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import io.swagger.v3.oas.annotations.media.DependentRequired;
4040
import io.swagger.v3.oas.annotations.media.DependentSchema;
4141
import io.swagger.v3.oas.annotations.media.DependentSchemas;
42-
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
4342
import io.swagger.v3.oas.annotations.media.PatternProperties;
4443
import io.swagger.v3.oas.annotations.media.PatternProperty;
4544
import io.swagger.v3.oas.annotations.media.SchemaProperties;
@@ -2669,24 +2668,7 @@ protected Map<String, Object> resolveExtensions(Annotated a, Annotation[] annota
26692668
}
26702669

26712670
protected void resolveDiscriminatorProperty(JavaType type, ModelConverterContext context, Schema model) {
2672-
// add JsonTypeInfo.property if not member of bean
2673-
JsonTypeInfo typeInfo = type.getRawClass().getDeclaredAnnotation(JsonTypeInfo.class);
2674-
if (typeInfo != null) {
2675-
String typeInfoProp = typeInfo.property();
2676-
if (StringUtils.isNotBlank(typeInfoProp)) {
2677-
Schema modelToUpdate = model;
2678-
if (StringUtils.isNotBlank(model.get$ref())) {
2679-
modelToUpdate = context.getDefinedModels().get(model.get$ref().substring(SCHEMA_COMPONENT_PREFIX));
2680-
}
2681-
if (modelToUpdate.getProperties() == null || !modelToUpdate.getProperties().keySet().contains(typeInfoProp)) {
2682-
Schema discriminatorSchema = openapi31 ? new JsonSchema().typesItem("string").name(typeInfoProp) : new StringSchema().name(typeInfoProp);
2683-
modelToUpdate.addProperties(typeInfoProp, discriminatorSchema);
2684-
if (modelToUpdate.getRequired() == null || !modelToUpdate.getRequired().contains(typeInfoProp)) {
2685-
modelToUpdate.addRequiredItem(typeInfoProp);
2686-
}
2687-
}
2688-
}
2689-
}
2671+
DiscriminatorUtils.resolveDiscriminatorProperty(type, context, model, openapi31);
26902672
}
26912673

26922674
/*
@@ -2723,35 +2705,7 @@ protected Schema resolveWrapping(JavaType type, ModelConverterContext context, S
27232705
}
27242706

27252707
protected Discriminator resolveDiscriminator(JavaType type, ModelConverterContext context) {
2726-
2727-
io.swagger.v3.oas.annotations.media.Schema declaredSchemaAnnotation = AnnotationsUtils.getSchemaDeclaredAnnotation(type.getRawClass());
2728-
2729-
String disc = (declaredSchemaAnnotation == null) ? "" : declaredSchemaAnnotation.discriminatorProperty();
2730-
2731-
if (disc.isEmpty()) {
2732-
// longer method would involve AnnotationIntrospector.findTypeResolver(...) but:
2733-
JsonTypeInfo typeInfo = type.getRawClass().getDeclaredAnnotation(JsonTypeInfo.class);
2734-
if (typeInfo != null) {
2735-
disc = typeInfo.property();
2736-
}
2737-
}
2738-
if (!disc.isEmpty()) {
2739-
Discriminator discriminator = new Discriminator()
2740-
.propertyName(disc);
2741-
if (declaredSchemaAnnotation != null) {
2742-
DiscriminatorMapping[] mappings = declaredSchemaAnnotation.discriminatorMapping();
2743-
if (mappings != null && mappings.length > 0) {
2744-
for (DiscriminatorMapping mapping : mappings) {
2745-
if (!mapping.value().isEmpty() && !mapping.schema().equals(Void.class)) {
2746-
discriminator.mapping(mapping.value(), constructRef(context.resolve(new AnnotatedType().type(mapping.schema())).getName()));
2747-
}
2748-
}
2749-
}
2750-
}
2751-
2752-
return discriminator;
2753-
}
2754-
return null;
2708+
return DiscriminatorUtils.resolveDiscriminator(type, context);
27552709
}
27562710

27572711
protected XML resolveXml(Annotated a, Annotation[] annotations, io.swagger.v3.oas.annotations.media.Schema schema) {
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package io.swagger.v3.core.util;
2+
3+
import com.fasterxml.jackson.annotation.JsonTypeInfo;
4+
import com.fasterxml.jackson.databind.JavaType;
5+
import io.swagger.v3.core.converter.AnnotatedType;
6+
import io.swagger.v3.core.converter.ModelConverterContext;
7+
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
8+
import io.swagger.v3.oas.models.media.Discriminator;
9+
import io.swagger.v3.oas.models.media.JsonSchema;
10+
import io.swagger.v3.oas.models.media.Schema;
11+
import io.swagger.v3.oas.models.media.StringSchema;
12+
import org.apache.commons.lang3.StringUtils;
13+
14+
import static io.swagger.v3.core.util.RefUtils.constructRef;
15+
16+
public class DiscriminatorUtils {
17+
18+
private static final int SCHEMA_COMPONENT_PREFIX = "#/components/schemas/".length();
19+
private static final String TYPE_STRING = "string";
20+
21+
public static void resolveDiscriminatorProperty(JavaType type,
22+
ModelConverterContext context,
23+
Schema model,
24+
boolean openapi31) {
25+
// add JsonTypeInfo.property if not member of bean
26+
JsonTypeInfo typeInfo = type.getRawClass().getDeclaredAnnotation(JsonTypeInfo.class);
27+
if (typeInfo != null) {
28+
String typeInfoProp = typeInfo.property();
29+
if (StringUtils.isNotBlank(typeInfoProp)) {
30+
Schema modelToUpdate = model;
31+
if (StringUtils.isNotBlank(model.get$ref())) {
32+
modelToUpdate = context.getDefinedModels().get(model.get$ref().substring(SCHEMA_COMPONENT_PREFIX));
33+
}
34+
if (modelToUpdate.getProperties() == null || !modelToUpdate.getProperties().keySet().contains(typeInfoProp)) {
35+
Schema discriminatorSchema = openapi31 ? new JsonSchema().typesItem(TYPE_STRING).name(typeInfoProp) : new StringSchema().name(typeInfoProp);
36+
modelToUpdate.addProperties(typeInfoProp, discriminatorSchema);
37+
if (modelToUpdate.getRequired() == null || !modelToUpdate.getRequired().contains(typeInfoProp)) {
38+
modelToUpdate.addRequiredItem(typeInfoProp);
39+
}
40+
}
41+
}
42+
}
43+
}
44+
45+
public static Discriminator resolveDiscriminator(JavaType type, ModelConverterContext context) {
46+
io.swagger.v3.oas.annotations.media.Schema declaredSchemaAnnotation = AnnotationsUtils.getSchemaDeclaredAnnotation(type.getRawClass());
47+
48+
String disc = (declaredSchemaAnnotation == null) ? "" : declaredSchemaAnnotation.discriminatorProperty();
49+
50+
if (disc.isEmpty()) {
51+
// longer method would involve AnnotationIntrospector.findTypeResolver(...) but:
52+
JsonTypeInfo typeInfo = type.getRawClass().getDeclaredAnnotation(JsonTypeInfo.class);
53+
if (typeInfo != null) {
54+
disc = typeInfo.property();
55+
}
56+
}
57+
if (!disc.isEmpty()) {
58+
Discriminator discriminator = new Discriminator()
59+
.propertyName(disc);
60+
if (declaredSchemaAnnotation != null) {
61+
DiscriminatorMapping[] mappings = declaredSchemaAnnotation.discriminatorMapping();
62+
if (mappings != null && mappings.length > 0) {
63+
for (DiscriminatorMapping mapping : mappings) {
64+
if (!mapping.value().isEmpty() && !mapping.schema().equals(Void.class)) {
65+
discriminator.mapping(mapping.value(), constructRef(context.resolve(new AnnotatedType().type(mapping.schema())).getName()));
66+
}
67+
}
68+
}
69+
}
70+
71+
return discriminator;
72+
}
73+
return null;
74+
}
75+
}

0 commit comments

Comments
 (0)