Support for discriminator.mapping (#536)

This commit is contained in:
Daonomic
2018-07-18 07:14:42 +03:00
committed by Jérémie Bresson
parent 478d6ced4e
commit 0a52f56ba4
94 changed files with 1149 additions and 307 deletions

View File

@@ -0,0 +1,88 @@
package org.openapitools.codegen;
import java.util.*;
public class CodegenDiscriminator {
private String propertyName;
private Map<String, String> mapping;
private Set<MappedModel> mappedModels = new LinkedHashSet<>();
public String getPropertyName() {
return propertyName;
}
public void setPropertyName(String propertyName) {
this.propertyName = propertyName;
}
public Map<String, String> getMapping() {
return mapping;
}
public void setMapping(Map<String, String> mapping) {
this.mapping = mapping;
}
public Set<MappedModel> getMappedModels() {
return mappedModels;
}
public void setMappedModels(Set<MappedModel> mappedModels) {
this.mappedModels = mappedModels;
}
public static class MappedModel {
private String mappingName;
private String modelName;
public MappedModel(String mappingName, String modelName) {
this.mappingName = mappingName;
this.modelName = modelName;
}
public String getMappingName() {
return mappingName;
}
public void setMappingName(String mappingName) {
this.mappingName = mappingName;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MappedModel that = (MappedModel) o;
return Objects.equals(mappingName, that.mappingName) &&
Objects.equals(modelName, that.modelName);
}
@Override
public int hashCode() {
return Objects.hash(mappingName, modelName);
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CodegenDiscriminator that = (CodegenDiscriminator) o;
return Objects.equals(propertyName, that.propertyName) &&
Objects.equals(mapping, that.mapping) &&
Objects.equals(mappedModels, that.mappedModels);
}
@Override
public int hashCode() {
return Objects.hash(propertyName, mapping, mappedModels);
}
}

View File

@@ -18,15 +18,14 @@
package org.openapitools.codegen;
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.media.Discriminator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
import java.util.Objects;
public class CodegenModel {
public String parent, parentSchema;
@@ -40,7 +39,7 @@ public class CodegenModel {
public String name, classname, title, description, classVarName, modelJson, dataType, xmlPrefix, xmlNamespace, xmlName;
public String classFilename; // store the class file name, mainly used for import
public String unescapedDescription;
public Discriminator discriminator;
public CodegenDiscriminator discriminator;
public String defaultValue;
public String arrayModelType;
public boolean isAlias; // Is this effectively an alias of another simple type
@@ -349,7 +348,7 @@ public class CodegenModel {
this.unescapedDescription = unescapedDescription;
}
public Discriminator getDiscriminator() {
public CodegenDiscriminator getDiscriminator() {
return discriminator;
}
@@ -357,7 +356,7 @@ public class CodegenModel {
return discriminator == null ? null : discriminator.getPropertyName();
}
public void setDiscriminator(Discriminator discriminator) {
public void setDiscriminator(CodegenDiscriminator discriminator) {
this.discriminator = discriminator;
}

View File

@@ -18,17 +18,15 @@
package org.openapitools.codegen;
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.media.Discriminator;
import io.swagger.v3.oas.models.parameters.RequestBody;
import io.swagger.v3.oas.models.tags.Tag;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Arrays;
public class CodegenOperation {
public final List<CodegenProperty> responseHeaders = new ArrayList<CodegenProperty>();
@@ -40,7 +38,7 @@ public class CodegenOperation {
isRestful, isDeprecated;
public String path, operationId, returnType, httpMethod, returnBaseType,
returnContainer, summary, unescapedNotes, notes, baseName, defaultResponse;
public Discriminator discriminator;
public CodegenDiscriminator discriminator;
public List<Map<String, String>> consumes, produces, prioritizedContentTypes;
public CodegenParameter bodyParam;
public List<CodegenParameter> allParams = new ArrayList<CodegenParameter>();

View File

@@ -26,7 +26,12 @@ import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.examples.Example;
import io.swagger.v3.oas.models.headers.Header;
import io.swagger.v3.oas.models.media.*;
import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.ComposedSchema;
import io.swagger.v3.oas.models.media.Content;
import io.swagger.v3.oas.models.media.MediaType;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.oas.models.parameters.CookieParameter;
import io.swagger.v3.oas.models.parameters.HeaderParameter;
import io.swagger.v3.oas.models.parameters.Parameter;
@@ -43,6 +48,7 @@ import io.swagger.v3.parser.util.SchemaTypeUtil;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.openapitools.codegen.CodegenDiscriminator.MappedModel;
import org.openapitools.codegen.examples.ExampleGenerator;
import org.openapitools.codegen.serializer.SerializerUtils;
import org.openapitools.codegen.utils.ModelUtils;
@@ -66,6 +72,7 @@ import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class DefaultCodegen implements CodegenConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCodegen.class);
@@ -1469,6 +1476,10 @@ public class DefaultCodegen implements CodegenConfig {
// unalias schema
schema = ModelUtils.unaliasSchema(allDefinitions, schema);
if (schema == null) {
LOGGER.warn("Schema {} not found", name);
return null;
}
CodegenModel m = CodegenModelFactory.newInstance(CodegenModelType.MODEL);
@@ -1489,7 +1500,7 @@ public class DefaultCodegen implements CodegenConfig {
m.getVendorExtensions().putAll(schema.getExtensions());
}
m.isAlias = typeAliases.containsKey(name);
m.discriminator = schema.getDiscriminator();
m.discriminator = createDiscriminator(name, schema, allDefinitions);
if (schema.getXml() != null) {
m.xmlPrefix = schema.getXml().getPrefix();
@@ -1516,7 +1527,7 @@ public class DefaultCodegen implements CodegenConfig {
int modelImplCnt = 0; // only one inline object allowed in a ComposedModel
for (Schema innerModel : composed.getAllOf()) {
if (m.discriminator == null) {
m.discriminator = schema.getDiscriminator();
m.discriminator = createDiscriminator(name, schema, allDefinitions);
}
if (innerModel.getXml() != null) {
m.xmlPrefix = innerModel.getXml().getPrefix();
@@ -1631,6 +1642,34 @@ public class DefaultCodegen implements CodegenConfig {
return m;
}
private CodegenDiscriminator createDiscriminator(String schemaName, Schema schema, Map<String, Schema> allDefinitions) {
if(schema.getDiscriminator() == null) {
return null;
}
CodegenDiscriminator discriminator = new CodegenDiscriminator();
discriminator.setPropertyName(schema.getDiscriminator().getPropertyName());
discriminator.setMapping(schema.getDiscriminator().getMapping());
if(schema.getDiscriminator().getMapping() != null && !schema.getDiscriminator().getMapping().isEmpty()) {
for (Entry<String, String> e : schema.getDiscriminator().getMapping().entrySet()) {
String name = ModelUtils.getSimpleRef(e.getValue());
discriminator.getMappedModels().add(new MappedModel(e.getKey(), name));
}
} else {
allDefinitions.forEach((childName, child) -> {
if (child instanceof ComposedSchema && ((ComposedSchema) child).getAllOf() != null) {
Set<String> parentSchemas = ((ComposedSchema) child).getAllOf().stream()
.filter(s -> s.get$ref() != null)
.map(s -> ModelUtils.getSimpleRef(s.get$ref()))
.collect(Collectors.toSet());
if (parentSchemas.contains(schemaName)) {
discriminator.getMappedModels().add(new MappedModel(childName, childName));
}
}
});
}
return discriminator;
}
protected void addAdditionPropertiesToCodeGenModel(CodegenModel codegenModel, Schema schema) {
addParentContainer(codegenModel, codegenModel.name, schema);
}

View File

@@ -523,25 +523,6 @@ public class JavaClientCodegen extends AbstractJavaCodegen
}
}
@SuppressWarnings("unchecked")
@Override
public Map<String, Object> postProcessAllModels(Map<String, Object> objs) {
Map<String, Object> allProcessedModels = super.postProcessAllModels(objs);
if (!additionalProperties.containsKey("gsonFactoryMethod")) {
List<Object> allModels = new ArrayList<Object>();
for (String name : allProcessedModels.keySet()) {
Map<String, Object> models = (Map<String, Object>) allProcessedModels.get(name);
try {
allModels.add(((List<Object>) models.get("models")).get(0));
} catch (Exception e) {
e.printStackTrace();
}
}
additionalProperties.put("parent", modelInheritanceSupportInGson(allModels));
}
return allProcessedModels;
}
@Override
public Map<String, Object> postProcessModelsEnum(Map<String, Object> objs) {
objs = super.postProcessModelsEnum(objs);
@@ -564,34 +545,6 @@ public class JavaClientCodegen extends AbstractJavaCodegen
return objs;
}
public static List<Map<String, Object>> modelInheritanceSupportInGson(List<?> allModels) {
Map<CodegenModel, List<CodegenModel>> byParent = new LinkedHashMap<>();
for (Object model : allModels) {
Map entry = (Map) model;
CodegenModel parent = ((CodegenModel)entry.get("model")).parentModel;
if(null!= parent) {
byParent.computeIfAbsent(parent, k -> new LinkedList<>()).add((CodegenModel)entry.get("model"));
}
}
List<Map<String, Object>> parentsList = new ArrayList<>();
for (CodegenModel parentModel : byParent.keySet()) {
List<Map<String, Object>> childrenList = new ArrayList<>();
Map<String, Object> parent = new HashMap<>();
parent.put("classname", parentModel.classname);
List<CodegenModel> childrenModels = byParent.get(parentModel);
for (CodegenModel model : childrenModels) {
Map<String, Object> child = new HashMap<>();
child.put("name", model.name);
child.put("classname", model.classname);
childrenList.add(child);
}
parent.put("children", childrenList);
parent.put("discriminator", parentModel.discriminator);
parentsList.add(parent);
}
return parentsList;
}
public void setUseRxJava(boolean useRxJava) {
this.useRxJava = useRxJava;
doNotUseRx = false;

View File

@@ -60,21 +60,20 @@ public class JSON {
public static GsonBuilder createGson() {
GsonFireBuilder fireBuilder = new GsonFireBuilder()
{{#parent}}
.registerTypeSelector({{classname}}.class, new TypeSelector() {
{{#models}}{{#model}}{{#discriminator}} .registerTypeSelector({{classname}}.class, new TypeSelector() {
@Override
public Class getClassForElement(JsonElement readElement) {
Map classByDiscriminatorValue = new HashMap();
{{#children}}
classByDiscriminatorValue.put("{{name}}".toUpperCase(), {{classname}}.class);
{{/children}}
{{#mappedModels}}
classByDiscriminatorValue.put("{{mappingName}}".toUpperCase(), {{modelName}}.class);
{{/mappedModels}}
classByDiscriminatorValue.put("{{classname}}".toUpperCase(), {{classname}}.class);
return getClassByDiscriminator(
classByDiscriminatorValue,
getDiscriminatorValue(readElement, "{{{discriminatorName}}}"));
getDiscriminatorValue(readElement, "{{{propertyName}}}"));
}
})
{{/parent}}
{{/discriminator}}{{/model}}{{/models}}
;
GsonBuilder builder = fireBuilder.createGsonBuilder();
{{#disableHtmlEscaping}}

View File

@@ -57,21 +57,20 @@ public class JSON {
public static GsonBuilder createGson() {
GsonFireBuilder fireBuilder = new GsonFireBuilder()
{{#parent}}
.registerTypeSelector({{classname}}.class, new TypeSelector() {
{{#models}}{{#model}}{{#discriminator}} .registerTypeSelector({{classname}}.class, new TypeSelector() {
@Override
public Class getClassForElement(JsonElement readElement) {
Map classByDiscriminatorValue = new HashMap();
{{#children}}
classByDiscriminatorValue.put("{{name}}".toUpperCase(), {{classname}}.class);
{{/children}}
{{#mappedModels}}
classByDiscriminatorValue.put("{{mappingName}}".toUpperCase(), {{modelName}}.class);
{{/mappedModels}}
classByDiscriminatorValue.put("{{classname}}".toUpperCase(), {{classname}}.class);
return getClassByDiscriminator(
classByDiscriminatorValue,
getDiscriminatorValue(readElement, "{{{discriminatorName}}}"));
getDiscriminatorValue(readElement, "{{{propertyName}}}"));
}
})
{{/parent}}
{{/discriminator}}{{/model}}{{/models}}
;
return fireBuilder.createGsonBuilder();
}

View File

@@ -1,7 +1,8 @@
{{#jackson}}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminatorName}}}", visible = true)
@JsonSubTypes({
{{#children}}
@JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/children}}
{{#discriminator.mappedModels}}
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/discriminator.mappedModels}}
}){{/jackson}}

View File

@@ -1,7 +1,8 @@
{{#jackson}}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminatorName}}}", visible = true)
@JsonSubTypes({
{{#children}}
@JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/children}}
{{#discriminator.mappedModels}}
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/discriminator.mappedModels}}
}){{/jackson}}

View File

@@ -1,7 +1,8 @@
{{#jackson}}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminatorName}}}", visible = true)
@JsonSubTypes({
{{#children}}
@JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/children}}
{{#discriminator.mappedModels}}
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/discriminator.mappedModels}}
}){{/jackson}}

View File

@@ -1,7 +1,8 @@
{{#jackson}}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminatorName}}}", visible = true)
@JsonSubTypes({
{{#children}}
@JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/children}}
{{#discriminator.mappedModels}}
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/discriminator.mappedModels}}
}){{/jackson}}

View File

@@ -1,7 +1,8 @@
{{#jackson}}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminatorName}}}", visible = true)
@JsonSubTypes({
{{#children}}
@JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/children}}
{{#discriminator.mappedModels}}
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/discriminator.mappedModels}}
}){{/jackson}}

View File

@@ -1,7 +1,8 @@
{{#jackson}}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminatorName}}}", visible = true)
@JsonSubTypes({
{{#children}}
@JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/children}}
{{#discriminator.mappedModels}}
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
{{/discriminator.mappedModels}}
}){{/jackson}}

View File

@@ -356,6 +356,47 @@ public class DefaultCodegenTest {
Assert.assertEquals(codegenParameter2.example, "An example4 value");
}
@Test
public void testDiscriminator() {
final OpenAPI openAPI = new OpenAPIParser().readLocation("src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml", null, new ParseOptions()).getOpenAPI();
DefaultCodegen codegen = new DefaultCodegen();
Schema animal = openAPI.getComponents().getSchemas().get("Animal");
CodegenModel animalModel = codegen.fromModel("Animal", animal, openAPI.getComponents().getSchemas());
CodegenDiscriminator discriminator = animalModel.getDiscriminator();
CodegenDiscriminator test = new CodegenDiscriminator();
test.setPropertyName("className");
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("Dog", "Dog"));
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("Cat", "Cat"));
Assert.assertEquals(discriminator, test);
}
@Test
public void testDiscriminatorWithCustomMapping() {
final OpenAPI openAPI = new OpenAPIParser().readLocation("src/test/resources/3_0/allOf.yaml", null, new ParseOptions()).getOpenAPI();
DefaultCodegen codegen = new DefaultCodegen();
String path = "/person/display/{personId}";
Operation operation = openAPI.getPaths().get(path).getGet();
CodegenOperation codegenOperation = codegen.fromOperation(path, "GET", operation, openAPI.getComponents().getSchemas());
verifyPersonDiscriminator(codegenOperation.discriminator);
Schema person = openAPI.getComponents().getSchemas().get("Person");
CodegenModel personModel = codegen.fromModel("Person", person, openAPI.getComponents().getSchemas());
verifyPersonDiscriminator(personModel.discriminator);
}
private void verifyPersonDiscriminator(CodegenDiscriminator discriminator) {
CodegenDiscriminator test = new CodegenDiscriminator();
test.setPropertyName("$_type");
test.setMapping(new HashMap<>());
test.getMapping().put("a", "#/components/schemas/Adult");
test.getMapping().put("c", "#/components/schemas/Child");
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("a", "Adult"));
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("c", "Child"));
Assert.assertEquals(discriminator, test);
}
private CodegenProperty codegenPropertyWithArrayOfIntegerValues() {
CodegenProperty array = new CodegenProperty();
final CodegenProperty items = new CodegenProperty();

View File

@@ -64,111 +64,6 @@ import java.util.stream.Collectors;
public class JavaClientCodegenTest {
@Test
public void modelInheritanceSupportInGson() throws Exception {
List<Map<String, Object>> allModels = new ArrayList<>();
CodegenModel parent1 = CodegenModelFactory.newInstance(CodegenModelType.MODEL);
parent1.setName("parent1");
parent1.setClassname("test.Parent1");
Map<String, Object> modelMap = new HashMap<>();
modelMap.put("model", parent1);
allModels.add(modelMap);
CodegenModel parent2 = CodegenModelFactory.newInstance(CodegenModelType.MODEL);
parent2.setName("parent2");
parent2.setClassname("test.Parent2");
modelMap = new HashMap<>();
modelMap.put("model", parent2);
allModels.add(modelMap);
CodegenModel model1 = CodegenModelFactory.newInstance(CodegenModelType.MODEL);
model1.setName("model1");
model1.setClassname("test.Model1");
model1.setParentModel(parent1);
modelMap = new HashMap<>();
modelMap.put("model", model1);
allModels.add(modelMap);
CodegenModel model2 = CodegenModelFactory.newInstance(CodegenModelType.MODEL);
model2.setName("model2");
model2.setClassname("test.Model2");
model2.setParentModel(parent1);
modelMap = new HashMap<>();
modelMap.put("model", model2);
allModels.add(modelMap);
CodegenModel model3 = CodegenModelFactory.newInstance(CodegenModelType.MODEL);
model3.setName("model3");
model3.setClassname("test.Model3");
model3.setParentModel(parent1);
modelMap = new HashMap<>();
modelMap.put("model", model3);
allModels.add(modelMap);
CodegenModel model4 = CodegenModelFactory.newInstance(CodegenModelType.MODEL);
model4.setName("model4");
model4.setClassname("test.Model4");
model4.setParentModel(parent2);
modelMap = new HashMap<>();
modelMap.put("model", model4);
allModels.add(modelMap);
CodegenModel model5 = CodegenModelFactory.newInstance(CodegenModelType.MODEL);
model5.setName("model5");
model5.setClassname("test.Model5");
model5.setParentModel(parent2);
modelMap = new HashMap<>();
modelMap.put("model", model5);
allModels.add(modelMap);
List<Map<String, Object>> parentsList = JavaClientCodegen.modelInheritanceSupportInGson(allModels);
Assert.assertNotNull(parentsList);
Assert.assertEquals(parentsList.size(), 2);
Map<String, Object> parent = parentsList.get(0);
Assert.assertEquals(parent.get("classname"), "test.Parent1");
List<CodegenModel> children = (List<CodegenModel>) parent.get("children");
Assert.assertNotNull(children);
Assert.assertEquals(children.size(), 3);
Map<String, Object> models = (Map<String, Object>) children.get(0);
Assert.assertEquals(models.get("name"), "model1");
Assert.assertEquals(models.get("classname"), "test.Model1");
models = (Map<String, Object>) children.get(1);
Assert.assertEquals(models.get("name"), "model2");
Assert.assertEquals(models.get("classname"), "test.Model2");
models = (Map<String, Object>) children.get(2);
Assert.assertEquals(models.get("name"), "model3");
Assert.assertEquals(models.get("classname"), "test.Model3");
parent = parentsList.get(1);
Assert.assertEquals(parent.get("classname"), "test.Parent2");
children = (List<CodegenModel>) parent.get("children");
Assert.assertNotNull(children);
Assert.assertEquals(children.size(), 2);
models = (Map<String, Object>) children.get(0);
Assert.assertEquals(models.get("name"), "model4");
Assert.assertEquals(models.get("classname"), "test.Model4");
models = (Map<String, Object>) children.get(1);
Assert.assertEquals(models.get("name"), "model5");
Assert.assertEquals(models.get("classname"), "test.Model5");
}
@Test
public void arraysInRequestBody() throws Exception {
final JavaClientCodegen codegen = new JavaClientCodegen();

View File

@@ -0,0 +1,61 @@
openapi: 3.0.1
info:
version: 1.0.0
title: Example
license:
name: MIT
servers:
- url: http://api.example.xyz/v1
paths:
/person/display/{personId}:
get:
parameters:
- name: personId
in: path
required: true
description: The id of the person to retrieve
schema:
type: string
operationId: list
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/Person"
components:
schemas:
Person:
type: object
discriminator:
propertyName: $_type
mapping:
a: '#/components/schemas/Adult'
c: '#/components/schemas/Child'
properties:
$_type:
type: string
lastName:
type: string
firstName:
type: string
Adult:
description: A representation of an adult
allOf:
- $ref: '#/components/schemas/Person'
- type: object
properties:
children:
type: array
items:
$ref: "#/components/schemas/Child"
Child:
description: A representation of a child
allOf:
- $ref: '#/components/schemas/Person'
- type: object
properties:
age:
type: integer
format: int32

View File

@@ -26,6 +26,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -26,6 +26,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -26,6 +26,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -25,6 +25,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -26,6 +26,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -26,6 +26,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -55,14 +55,15 @@ public class JSON {
@Override
public Class getClassForElement(JsonElement readElement) {
Map classByDiscriminatorValue = new HashMap();
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Dog".toUpperCase(), Dog.class);
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Animal".toUpperCase(), Animal.class);
return getClassByDiscriminator(
classByDiscriminatorValue,
getDiscriminatorValue(readElement, ""));
getDiscriminatorValue(readElement, "className"));
}
})
;
GsonBuilder builder = fireBuilder.createGsonBuilder();
return builder;

View File

@@ -55,14 +55,15 @@ public class JSON {
@Override
public Class getClassForElement(JsonElement readElement) {
Map classByDiscriminatorValue = new HashMap();
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Dog".toUpperCase(), Dog.class);
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Animal".toUpperCase(), Animal.class);
return getClassByDiscriminator(
classByDiscriminatorValue,
getDiscriminatorValue(readElement, ""));
getDiscriminatorValue(readElement, "className"));
}
})
;
GsonBuilder builder = fireBuilder.createGsonBuilder();
return builder;

View File

@@ -55,14 +55,15 @@ public class JSON {
@Override
public Class getClassForElement(JsonElement readElement) {
Map classByDiscriminatorValue = new HashMap();
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Dog".toUpperCase(), Dog.class);
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Animal".toUpperCase(), Animal.class);
return getClassByDiscriminator(
classByDiscriminatorValue,
getDiscriminatorValue(readElement, ""));
getDiscriminatorValue(readElement, "className"));
}
})
;
GsonBuilder builder = fireBuilder.createGsonBuilder();
return builder;

View File

@@ -26,6 +26,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -28,6 +28,7 @@ import javax.xml.bind.annotation.*;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -26,6 +26,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -28,6 +28,7 @@ import javax.validation.Valid;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -28,6 +28,7 @@ import javax.validation.Valid;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -52,14 +52,15 @@ public class JSON {
@Override
public Class getClassForElement(JsonElement readElement) {
Map classByDiscriminatorValue = new HashMap();
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Dog".toUpperCase(), Dog.class);
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Animal".toUpperCase(), Animal.class);
return getClassByDiscriminator(
classByDiscriminatorValue,
getDiscriminatorValue(readElement, ""));
getDiscriminatorValue(readElement, "className"));
}
})
;
return fireBuilder.createGsonBuilder();
}

View File

@@ -52,14 +52,15 @@ public class JSON {
@Override
public Class getClassForElement(JsonElement readElement) {
Map classByDiscriminatorValue = new HashMap();
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Dog".toUpperCase(), Dog.class);
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Animal".toUpperCase(), Animal.class);
return getClassByDiscriminator(
classByDiscriminatorValue,
getDiscriminatorValue(readElement, ""));
getDiscriminatorValue(readElement, "className"));
}
})
;
return fireBuilder.createGsonBuilder();
}

View File

@@ -52,14 +52,15 @@ public class JSON {
@Override
public Class getClassForElement(JsonElement readElement) {
Map classByDiscriminatorValue = new HashMap();
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Dog".toUpperCase(), Dog.class);
classByDiscriminatorValue.put("Cat".toUpperCase(), Cat.class);
classByDiscriminatorValue.put("Animal".toUpperCase(), Animal.class);
return getClassByDiscriminator(
classByDiscriminatorValue,
getDiscriminatorValue(readElement, ""));
getDiscriminatorValue(readElement, "className"));
}
})
;
return fireBuilder.createGsonBuilder();
}

View File

@@ -26,6 +26,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -26,6 +26,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -1 +1 @@
3.0.1-SNAPSHOT
3.1.1-SNAPSHOT

View File

@@ -26,7 +26,7 @@ public class Cat extends Animal {
@ApiModelProperty(value = "")
@JsonProperty("declawed")
public Boolean isDeclawed() {
public Boolean getDeclawed() {
return declawed;
}
public void setDeclawed(Boolean declawed) {

View File

@@ -0,0 +1,98 @@
package org.openapitools.model;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonCreator;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.ArrayList;
import java.util.List;
public class FileSchemaTestClass {
@JsonProperty("file")
private java.io.File file = null;
@JsonProperty("files")
private List<java.io.File> files = null;
/**
**/
public FileSchemaTestClass file(java.io.File file) {
this.file = file;
return this;
}
@ApiModelProperty(value = "")
@JsonProperty("file")
public java.io.File getFile() {
return file;
}
public void setFile(java.io.File file) {
this.file = file;
}
/**
**/
public FileSchemaTestClass files(List<java.io.File> files) {
this.files = files;
return this;
}
@ApiModelProperty(value = "")
@JsonProperty("files")
public List<java.io.File> getFiles() {
return files;
}
public void setFiles(List<java.io.File> files) {
this.files = files;
}
@Override
public boolean equals(java.lang.Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
FileSchemaTestClass fileSchemaTestClass = (FileSchemaTestClass) o;
return Objects.equals(file, fileSchemaTestClass.file) &&
Objects.equals(files, fileSchemaTestClass.files);
}
@Override
public int hashCode() {
return Objects.hash(file, files);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class FileSchemaTestClass {\n");
sb.append(" file: ").append(toIndentedString(file)).append("\n");
sb.append(" files: ").append(toIndentedString(files)).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(java.lang.Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

View File

@@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.openapitools.model.StringBooleanMap;
@@ -53,6 +54,12 @@ public class MapTest {
@JsonProperty("map_of_enum_string")
private Map<String, InnerEnum> mapOfEnumString = null;
@JsonProperty("direct_map")
private Map<String, Boolean> directMap = null;
@JsonProperty("indirect_map")
private StringBooleanMap indirectMap = null;
/**
**/
public MapTest mapMapOfString(Map<String, Map<String, String>> mapMapOfString) {
@@ -87,6 +94,40 @@ public class MapTest {
this.mapOfEnumString = mapOfEnumString;
}
/**
**/
public MapTest directMap(Map<String, Boolean> directMap) {
this.directMap = directMap;
return this;
}
@ApiModelProperty(value = "")
@JsonProperty("direct_map")
public Map<String, Boolean> getDirectMap() {
return directMap;
}
public void setDirectMap(Map<String, Boolean> directMap) {
this.directMap = directMap;
}
/**
**/
public MapTest indirectMap(StringBooleanMap indirectMap) {
this.indirectMap = indirectMap;
return this;
}
@ApiModelProperty(value = "")
@JsonProperty("indirect_map")
public StringBooleanMap getIndirectMap() {
return indirectMap;
}
public void setIndirectMap(StringBooleanMap indirectMap) {
this.indirectMap = indirectMap;
}
@Override
public boolean equals(java.lang.Object o) {
@@ -98,12 +139,14 @@ public class MapTest {
}
MapTest mapTest = (MapTest) o;
return Objects.equals(mapMapOfString, mapTest.mapMapOfString) &&
Objects.equals(mapOfEnumString, mapTest.mapOfEnumString);
Objects.equals(mapOfEnumString, mapTest.mapOfEnumString) &&
Objects.equals(directMap, mapTest.directMap) &&
Objects.equals(indirectMap, mapTest.indirectMap);
}
@Override
public int hashCode() {
return Objects.hash(mapMapOfString, mapOfEnumString);
return Objects.hash(mapMapOfString, mapOfEnumString, directMap, indirectMap);
}
@Override
@@ -113,6 +156,8 @@ public class MapTest {
sb.append(" mapMapOfString: ").append(toIndentedString(mapMapOfString)).append("\n");
sb.append(" mapOfEnumString: ").append(toIndentedString(mapOfEnumString)).append("\n");
sb.append(" directMap: ").append(toIndentedString(directMap)).append("\n");
sb.append(" indirectMap: ").append(toIndentedString(indirectMap)).append("\n");
sb.append("}");
return sb.toString();
}

View File

@@ -161,7 +161,7 @@ public class Order {
@ApiModelProperty(value = "")
@JsonProperty("complete")
public Boolean isComplete() {
public Boolean getComplete() {
return complete;
}
public void setComplete(Boolean complete) {

View File

@@ -0,0 +1,51 @@
package org.openapitools.model;
import java.util.Objects;
import java.util.HashMap;
import java.util.Map;
public class StringBooleanMap extends HashMap<String, Boolean> {
@Override
public boolean equals(java.lang.Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
StringBooleanMap stringBooleanMap = (StringBooleanMap) o;
return true;
}
@Override
public int hashCode() {
return Objects.hash();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class StringBooleanMap {\n");
sb.append(" ").append(toIndentedString(super.toString())).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(java.lang.Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

View File

@@ -14,7 +14,9 @@ import java.math.BigDecimal;
import org.openapitools.model.Client;
import java.util.Date;
import java.io.File;
import org.openapitools.model.FileSchemaTestClass;
import java.util.Map;
import org.openapitools.model.ModelApiResponse;
import org.openapitools.model.OuterComposite;
import org.openapitools.model.User;
@@ -50,6 +52,12 @@ public class FakeController {
}
*/
/*
public ResponseContext testBodyWithFileSchema(RequestContext request , FileSchemaTestClass fileSchemaTestClass) {
return new ResponseContext().status(Status.INTERNAL_SERVER_ERROR).entity( "Not implemented" );
}
*/
/*
public ResponseContext testBodyWithQueryParams(RequestContext request , String query, User user) {
return new ResponseContext().status(Status.INTERNAL_SERVER_ERROR).entity( "Not implemented" );
@@ -86,5 +94,11 @@ public class FakeController {
}
*/
/*
public ResponseContext uploadFileWithRequiredFile(RequestContext request , Long petId, FormDataContentDisposition fileDetail, String additionalMetadata) {
return new ResponseContext().status(Status.INTERNAL_SERVER_ERROR).entity( "Not implemented" );
}
*/
}

View File

@@ -1026,6 +1026,66 @@ paths:
- $another-fake?
x-contentType: application/json
x-accepts: application/json
/fake/body-with-file-schema:
put:
description: For this test, the body for this request much reference a schema named `File`.
operationId: testBodyWithFileSchema
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/FileSchemaTestClass'
required: true
responses:
200:
content: {}
description: Success
tags:
- fake
x-contentType: application/json
x-accepts: application/json
/fake/{petId}/uploadImageWithRequiredFile:
post:
operationId: uploadFileWithRequiredFile
parameters:
- description: ID of pet to update
in: path
name: petId
required: true
schema:
format: int64
type: integer
requestBody:
content:
multipart/form-data:
schema:
properties:
additionalMetadata:
description: Additional data to pass to server
type: string
file:
description: file to upload
format: binary
type: string
required:
- file
required: true
responses:
200:
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
description: successful operation
security:
- petstore_auth:
- write:pets
- read:pets
summary: uploads an image (required)
tags:
- pet
x-contentType: multipart/form-data
x-accepts: application/json
components:
schemas:
Category:
@@ -1331,14 +1391,18 @@ components:
type: array
type: object
OuterComposite:
example: {}
example:
my_string: my_string
my_number: 0.80082819046101150206595775671303272247314453125
my_boolean: true
properties:
my_number:
$ref: '#/components/schemas/OuterNumber'
type: number
my_string:
$ref: '#/components/schemas/OuterString'
type: string
my_boolean:
$ref: '#/components/schemas/OuterBoolean'
type: boolean
x-codegen-body-parameter-name: boolean_post_body
type: object
format_test:
properties:
@@ -1424,6 +1488,21 @@ components:
OuterBoolean:
type: boolean
x-codegen-body-parameter-name: boolean_post_body
FileSchemaTestClass:
example:
file:
sourceURI: sourceURI
files:
- sourceURI: sourceURI
- sourceURI: sourceURI
properties:
file:
$ref: '#/components/schemas/File'
files:
items:
$ref: '#/components/schemas/File'
type: array
type: object
Animal:
discriminator:
propertyName: className
@@ -1436,6 +1515,10 @@ components:
required:
- className
type: object
StringBooleanMap:
additionalProperties:
type: boolean
type: object
Cat:
allOf:
- $ref: '#/components/schemas/Animal'
@@ -1458,6 +1541,12 @@ components:
- lower
type: string
type: object
direct_map:
additionalProperties:
type: boolean
type: object
indirect_map:
$ref: '#/components/schemas/StringBooleanMap'
type: object
Tag:
example:
@@ -1476,6 +1565,14 @@ components:
items:
$ref: '#/components/schemas/Animal'
type: array
File:
example:
sourceURI: sourceURI
properties:
sourceURI:
description: Test capitalization
type: string
type: object
Pet:
example:
photoUrls:

View File

@@ -158,7 +158,7 @@ public class Order {
* Get complete
* @return complete
**/
public Boolean isComplete() {
public Boolean getComplete() {
return complete;
}

View File

@@ -108,13 +108,14 @@
"in" : "query",
"description" : "Status values that need to be considered for filter",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string",
"default" : "available",
"enum" : [ "available", "pending", "sold" ]
"enum" : [ "available", "pending", "sold" ],
"default" : "available"
}
}
} ],
@@ -162,6 +163,7 @@
"in" : "query",
"description" : "Tags to filter by",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",

View File

@@ -1 +1 @@
3.0.0-SNAPSHOT
3.1.1-SNAPSHOT

View File

@@ -158,7 +158,7 @@ public class Order {
* Get complete
* @return complete
**/
public Boolean isComplete() {
public Boolean getComplete() {
return complete;
}

View File

@@ -108,13 +108,14 @@
"in" : "query",
"description" : "Status values that need to be considered for filter",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string",
"default" : "available",
"enum" : [ "available", "pending", "sold" ]
"enum" : [ "available", "pending", "sold" ],
"default" : "available"
}
}
} ],
@@ -162,6 +163,7 @@
"in" : "query",
"description" : "Tags to filter by",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",

View File

@@ -158,7 +158,7 @@ public class Order {
* Get complete
* @return complete
**/
public Boolean isComplete() {
public Boolean getComplete() {
return complete;
}

View File

@@ -108,13 +108,14 @@
"in" : "query",
"description" : "Status values that need to be considered for filter",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string",
"default" : "available",
"enum" : [ "available", "pending", "sold" ]
"enum" : [ "available", "pending", "sold" ],
"default" : "available"
}
}
} ],
@@ -162,6 +163,7 @@
"in" : "query",
"description" : "Tags to filter by",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",

View File

@@ -1 +1 @@
3.0.0-SNAPSHOT
3.1.1-SNAPSHOT

View File

@@ -24,7 +24,7 @@ public class Cat extends Animal {
* Get declawed
* @return declawed
**/
public Boolean isDeclawed() {
public Boolean getDeclawed() {
return declawed;
}

View File

@@ -0,0 +1,108 @@
package apimodels;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.*;
import java.util.Set;
import javax.validation.*;
import java.util.Objects;
import javax.validation.constraints.*;
/**
* FileSchemaTestClass
*/
@SuppressWarnings({"UnusedReturnValue", "WeakerAccess"})
public class FileSchemaTestClass {
@JsonProperty("file")
private java.io.File file = null;
@JsonProperty("files")
private List<java.io.File> files = null;
public FileSchemaTestClass file(java.io.File file) {
this.file = file;
return this;
}
/**
* Get file
* @return file
**/
@Valid
public java.io.File getFile() {
return file;
}
public void setFile(java.io.File file) {
this.file = file;
}
public FileSchemaTestClass files(List<java.io.File> files) {
this.files = files;
return this;
}
public FileSchemaTestClass addFilesItem(java.io.File filesItem) {
if (files == null) {
files = new ArrayList<>();
}
files.add(filesItem);
return this;
}
/**
* Get files
* @return files
**/
@Valid
public List<java.io.File> getFiles() {
return files;
}
public void setFiles(List<java.io.File> files) {
this.files = files;
}
@Override
public boolean equals(java.lang.Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
FileSchemaTestClass fileSchemaTestClass = (FileSchemaTestClass) o;
return Objects.equals(file, fileSchemaTestClass.file) &&
Objects.equals(files, fileSchemaTestClass.files);
}
@Override
public int hashCode() {
return Objects.hash(file, files);
}
@SuppressWarnings("StringBufferReplaceableByString")
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class FileSchemaTestClass {\n");
sb.append(" file: ").append(toIndentedString(file)).append("\n");
sb.append(" files: ").append(toIndentedString(files)).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(java.lang.Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

View File

@@ -1,5 +1,6 @@
package apimodels;
import apimodels.StringBooleanMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -51,6 +52,12 @@ public class MapTest {
@JsonProperty("map_of_enum_string")
private Map<String, InnerEnum> mapOfEnumString = null;
@JsonProperty("direct_map")
private Map<String, Boolean> directMap = null;
@JsonProperty("indirect_map")
private StringBooleanMap indirectMap = null;
public MapTest mapMapOfString(Map<String, Map<String, String>> mapMapOfString) {
this.mapMapOfString = mapMapOfString;
return this;
@@ -102,6 +109,49 @@ public class MapTest {
this.mapOfEnumString = mapOfEnumString;
}
public MapTest directMap(Map<String, Boolean> directMap) {
this.directMap = directMap;
return this;
}
public MapTest putDirectMapItem(String key, Boolean directMapItem) {
if (this.directMap == null) {
this.directMap = new HashMap<>();
}
this.directMap.put(key, directMapItem);
return this;
}
/**
* Get directMap
* @return directMap
**/
public Map<String, Boolean> getDirectMap() {
return directMap;
}
public void setDirectMap(Map<String, Boolean> directMap) {
this.directMap = directMap;
}
public MapTest indirectMap(StringBooleanMap indirectMap) {
this.indirectMap = indirectMap;
return this;
}
/**
* Get indirectMap
* @return indirectMap
**/
@Valid
public StringBooleanMap getIndirectMap() {
return indirectMap;
}
public void setIndirectMap(StringBooleanMap indirectMap) {
this.indirectMap = indirectMap;
}
@Override
public boolean equals(java.lang.Object o) {
@@ -113,12 +163,14 @@ public class MapTest {
}
MapTest mapTest = (MapTest) o;
return Objects.equals(mapMapOfString, mapTest.mapMapOfString) &&
Objects.equals(mapOfEnumString, mapTest.mapOfEnumString);
Objects.equals(mapOfEnumString, mapTest.mapOfEnumString) &&
Objects.equals(directMap, mapTest.directMap) &&
Objects.equals(indirectMap, mapTest.indirectMap);
}
@Override
public int hashCode() {
return Objects.hash(mapMapOfString, mapOfEnumString);
return Objects.hash(mapMapOfString, mapOfEnumString, directMap, indirectMap);
}
@SuppressWarnings("StringBufferReplaceableByString")
@@ -129,6 +181,8 @@ public class MapTest {
sb.append(" mapMapOfString: ").append(toIndentedString(mapMapOfString)).append("\n");
sb.append(" mapOfEnumString: ").append(toIndentedString(mapOfEnumString)).append("\n");
sb.append(" directMap: ").append(toIndentedString(directMap)).append("\n");
sb.append(" indirectMap: ").append(toIndentedString(indirectMap)).append("\n");
sb.append("}");
return sb.toString();
}

View File

@@ -158,7 +158,7 @@ public class Order {
* Get complete
* @return complete
**/
public Boolean isComplete() {
public Boolean getComplete() {
return complete;
}

View File

@@ -0,0 +1,54 @@
package apimodels;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.*;
import java.util.Set;
import javax.validation.*;
import java.util.Objects;
import javax.validation.constraints.*;
/**
* StringBooleanMap
*/
@SuppressWarnings({"UnusedReturnValue", "WeakerAccess"})
public class StringBooleanMap extends HashMap<String, Boolean> {
@Override
public boolean equals(java.lang.Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
return true;
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode());
}
@SuppressWarnings("StringBufferReplaceableByString")
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class StringBooleanMap {\n");
sb.append(" ").append(toIndentedString(super.toString())).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(java.lang.Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

View File

@@ -2,6 +2,7 @@ package controllers;
import java.math.BigDecimal;
import apimodels.Client;
import apimodels.FileSchemaTestClass;
import java.io.InputStream;
import java.time.LocalDate;
import java.util.Map;
@@ -116,6 +117,22 @@ public class FakeApiController extends Controller {
return ok(result);
}
@ApiAction
public Result testBodyWithFileSchema() throws Exception {
JsonNode nodefileSchemaTestClass = request().body().asJson();
FileSchemaTestClass fileSchemaTestClass;
if (nodefileSchemaTestClass != null) {
fileSchemaTestClass = mapper.readValue(nodefileSchemaTestClass.toString(), FileSchemaTestClass.class);
if (configuration.getBoolean("useInputBeanValidation")) {
OpenAPIUtils.validate(fileSchemaTestClass);
}
} else {
throw new IllegalArgumentException("'FileSchemaTestClass' parameter is required");
}
imp.testBodyWithFileSchema(fileSchemaTestClass);
return ok();
}
@ApiAction
public Result testBodyWithQueryParams() throws Exception {
JsonNode nodeuser = request().body().asJson();

View File

@@ -2,6 +2,7 @@ package controllers;
import java.math.BigDecimal;
import apimodels.Client;
import apimodels.FileSchemaTestClass;
import java.io.InputStream;
import java.time.LocalDate;
import java.util.Map;
@@ -41,6 +42,11 @@ public class FakeApiControllerImp implements FakeApiControllerImpInterface {
return new String();
}
@Override
public void testBodyWithFileSchema(FileSchemaTestClass fileSchemaTestClass) throws Exception {
//Do your magic!!!
}
@Override
public void testBodyWithQueryParams( @NotNull String query, User user) throws Exception {
//Do your magic!!!

View File

@@ -2,6 +2,7 @@ package controllers;
import java.math.BigDecimal;
import apimodels.Client;
import apimodels.FileSchemaTestClass;
import java.io.InputStream;
import java.time.LocalDate;
import java.util.Map;
@@ -26,6 +27,8 @@ public interface FakeApiControllerImpInterface {
String fakeOuterStringSerialize(String body) throws Exception;
void testBodyWithFileSchema(FileSchemaTestClass fileSchemaTestClass) throws Exception;
void testBodyWithQueryParams( @NotNull String query, User user) throws Exception;
Client testClientModel(Client client) throws Exception;

View File

@@ -177,4 +177,25 @@ public class PetApiController extends Controller {
JsonNode result = mapper.valueToTree(obj);
return ok(result);
}
@ApiAction
public Result uploadFileWithRequiredFile(Long petId) throws Exception {
String valueadditionalMetadata = (request().body().asMultipartFormData().asFormUrlEncoded().get("additionalMetadata"))[0];
String additionalMetadata;
if (valueadditionalMetadata != null) {
additionalMetadata = valueadditionalMetadata;
} else {
additionalMetadata = "null";
}
Http.MultipartFormData.FilePart file = request().body().asMultipartFormData().getFile("file");
if ((file == null || ((File) file.getFile()).length() == 0)) {
throw new IllegalArgumentException("'file' file cannot be empty");
}
ModelApiResponse obj = imp.uploadFileWithRequiredFile(petId, file, additionalMetadata);
if (configuration.getBoolean("useOutputBeanValidation")) {
OpenAPIUtils.validate(obj);
}
JsonNode result = mapper.valueToTree(obj);
return ok(result);
}
}

View File

@@ -56,4 +56,10 @@ public class PetApiControllerImp implements PetApiControllerImpInterface {
return new ModelApiResponse();
}
@Override
public ModelApiResponse uploadFileWithRequiredFile(Long petId, Http.MultipartFormData.FilePart file, String additionalMetadata) throws Exception {
//Do your magic!!!
return new ModelApiResponse();
}
}

View File

@@ -29,4 +29,6 @@ public interface PetApiControllerImpInterface {
ModelApiResponse uploadFile(Long petId, String additionalMetadata, Http.MultipartFormData.FilePart file) throws Exception;
ModelApiResponse uploadFileWithRequiredFile(Long petId, Http.MultipartFormData.FilePart file, String additionalMetadata) throws Exception;
}

View File

@@ -13,6 +13,7 @@ POST /v2/fake/outer/boolean controllers.FakeApiControlle
POST /v2/fake/outer/composite controllers.FakeApiController.fakeOuterCompositeSerialize()
POST /v2/fake/outer/number controllers.FakeApiController.fakeOuterNumberSerialize()
POST /v2/fake/outer/string controllers.FakeApiController.fakeOuterStringSerialize()
PUT /v2/fake/body-with-file-schema controllers.FakeApiController.testBodyWithFileSchema()
PUT /v2/fake/body-with-query-params controllers.FakeApiController.testBodyWithQueryParams()
PATCH /v2/fake controllers.FakeApiController.testClientModel()
POST /v2/fake controllers.FakeApiController.testEndpointParameters()
@@ -32,6 +33,7 @@ GET /v2/pet/:petId controllers.PetApiController.getPetBy
PUT /v2/pet controllers.PetApiController.updatePet()
POST /v2/pet/:petId controllers.PetApiController.updatePetWithForm(petId: Long)
POST /v2/pet/:petId/uploadImage controllers.PetApiController.uploadFile(petId: Long)
POST /v2/fake/:petId/uploadImageWithRequiredFile controllers.PetApiController.uploadFileWithRequiredFile(petId: Long)
#Functions for Store API
DELETE /v2/store/order/:orderId controllers.StoreApiController.deleteOrder(orderId: String)

View File

@@ -108,13 +108,14 @@
"in" : "query",
"description" : "Status values that need to be considered for filter",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string",
"default" : "available",
"enum" : [ "available", "pending", "sold" ]
"enum" : [ "available", "pending", "sold" ],
"default" : "available"
}
}
} ],
@@ -162,6 +163,7 @@
"in" : "query",
"description" : "Tags to filter by",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",
@@ -833,12 +835,14 @@
"name" : "enum_header_string_array",
"in" : "header",
"description" : "Header parameter enum test (string array)",
"style" : "simple",
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string",
"default" : "$",
"enum" : [ ">", "$" ]
"enum" : [ ">", "$" ],
"default" : "$"
}
}
}, {
@@ -847,20 +851,21 @@
"description" : "Header parameter enum test (string)",
"schema" : {
"type" : "string",
"default" : "-efg",
"enum" : [ "_abc", "-efg", "(xyz)" ]
"enum" : [ "_abc", "-efg", "(xyz)" ],
"default" : "-efg"
}
}, {
"name" : "enum_query_string_array",
"in" : "query",
"description" : "Query parameter enum test (string array)",
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string",
"default" : "$",
"enum" : [ ">", "$" ]
"enum" : [ ">", "$" ],
"default" : "$"
}
}
}, {
@@ -869,8 +874,8 @@
"description" : "Query parameter enum test (string)",
"schema" : {
"type" : "string",
"default" : "-efg",
"enum" : [ "_abc", "-efg", "(xyz)" ]
"enum" : [ "_abc", "-efg", "(xyz)" ],
"default" : "-efg"
}
}, {
"name" : "enum_query_integer",
@@ -901,15 +906,15 @@
"description" : "Form parameter enum test (string array)",
"items" : {
"type" : "string",
"default" : "$",
"enum" : [ ">", "$" ]
"enum" : [ ">", "$" ],
"default" : "$"
}
},
"enum_form_string" : {
"type" : "string",
"description" : "Form parameter enum test (string)",
"default" : "-efg",
"enum" : [ "_abc", "-efg", "(xyz)" ]
"enum" : [ "_abc", "-efg", "(xyz)" ],
"default" : "-efg"
}
}
}
@@ -1328,6 +1333,86 @@
"x-contentType" : "application/json",
"x-accepts" : "application/json"
}
},
"/fake/body-with-file-schema" : {
"put" : {
"tags" : [ "fake" ],
"description" : "For this test, the body for this request much reference a schema named `File`.",
"operationId" : "testBodyWithFileSchema",
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/FileSchemaTestClass"
}
}
},
"required" : true
},
"responses" : {
"200" : {
"description" : "Success",
"content" : { }
}
},
"x-contentType" : "application/json",
"x-accepts" : "application/json"
}
},
"/fake/{petId}/uploadImageWithRequiredFile" : {
"post" : {
"tags" : [ "pet" ],
"summary" : "uploads an image (required)",
"operationId" : "uploadFileWithRequiredFile",
"parameters" : [ {
"name" : "petId",
"in" : "path",
"description" : "ID of pet to update",
"required" : true,
"schema" : {
"type" : "integer",
"format" : "int64"
}
} ],
"requestBody" : {
"content" : {
"multipart/form-data" : {
"schema" : {
"required" : [ "file" ],
"properties" : {
"additionalMetadata" : {
"type" : "string",
"description" : "Additional data to pass to server"
},
"file" : {
"type" : "string",
"description" : "file to upload",
"format" : "binary"
}
}
}
}
},
"required" : true
},
"responses" : {
"200" : {
"description" : "successful operation",
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/ApiResponse"
}
}
}
}
},
"security" : [ {
"petstore_auth" : [ "write:pets", "read:pets" ]
} ],
"x-contentType" : "multipart/form-data",
"x-accepts" : "application/json"
}
}
},
"components" : {
@@ -1502,8 +1587,8 @@
},
"EnumClass" : {
"type" : "string",
"default" : "-efg",
"enum" : [ "_abc", "-efg", "(xyz)" ]
"enum" : [ "_abc", "-efg", "(xyz)" ],
"default" : "-efg"
},
"List" : {
"type" : "object",
@@ -1740,16 +1825,21 @@
"type" : "object",
"properties" : {
"my_number" : {
"$ref" : "#/components/schemas/OuterNumber"
"type" : "number"
},
"my_string" : {
"$ref" : "#/components/schemas/OuterString"
"type" : "string"
},
"my_boolean" : {
"$ref" : "#/components/schemas/OuterBoolean"
"type" : "boolean",
"x-codegen-body-parameter-name" : "boolean_post_body"
}
},
"example" : { }
"example" : {
"my_string" : "my_string",
"my_number" : 0.80082819046101150206595775671303272247314453125,
"my_boolean" : true
}
},
"format_test" : {
"required" : [ "byte", "date", "number", "password" ],
@@ -1852,6 +1942,30 @@
"type" : "boolean",
"x-codegen-body-parameter-name" : "boolean_post_body"
},
"FileSchemaTestClass" : {
"type" : "object",
"properties" : {
"file" : {
"$ref" : "#/components/schemas/File"
},
"files" : {
"type" : "array",
"items" : {
"$ref" : "#/components/schemas/File"
}
}
},
"example" : {
"file" : {
"sourceURI" : "sourceURI"
},
"files" : [ {
"sourceURI" : "sourceURI"
}, {
"sourceURI" : "sourceURI"
} ]
}
},
"Animal" : {
"required" : [ "className" ],
"type" : "object",
@@ -1868,6 +1982,12 @@
"propertyName" : "className"
}
},
"StringBooleanMap" : {
"type" : "object",
"additionalProperties" : {
"type" : "boolean"
}
},
"Cat" : {
"allOf" : [ {
"$ref" : "#/components/schemas/Animal"
@@ -1898,6 +2018,15 @@
"type" : "string",
"enum" : [ "UPPER", "lower" ]
}
},
"direct_map" : {
"type" : "object",
"additionalProperties" : {
"type" : "boolean"
}
},
"indirect_map" : {
"$ref" : "#/components/schemas/StringBooleanMap"
}
}
},
@@ -1926,6 +2055,18 @@
"$ref" : "#/components/schemas/Animal"
}
},
"File" : {
"type" : "object",
"properties" : {
"sourceURI" : {
"type" : "string",
"description" : "Test capitalization"
}
},
"example" : {
"sourceURI" : "sourceURI"
}
},
"Pet" : {
"required" : [ "name", "photoUrls" ],
"type" : "object",

View File

@@ -156,7 +156,7 @@ public class Order {
* Get complete
* @return complete
**/
public Boolean isComplete() {
public Boolean getComplete() {
return complete;
}

View File

@@ -108,13 +108,14 @@
"in" : "query",
"description" : "Status values that need to be considered for filter",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string",
"default" : "available",
"enum" : [ "available", "pending", "sold" ]
"enum" : [ "available", "pending", "sold" ],
"default" : "available"
}
}
} ],
@@ -162,6 +163,7 @@
"in" : "query",
"description" : "Tags to filter by",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",

View File

@@ -158,7 +158,7 @@ public class Order {
* Get complete
* @return complete
**/
public Boolean isComplete() {
public Boolean getComplete() {
return complete;
}

View File

@@ -108,13 +108,14 @@
"in" : "query",
"description" : "Status values that need to be considered for filter",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string",
"default" : "available",
"enum" : [ "available", "pending", "sold" ]
"enum" : [ "available", "pending", "sold" ],
"default" : "available"
}
}
} ],
@@ -162,6 +163,7 @@
"in" : "query",
"description" : "Tags to filter by",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",

View File

@@ -1 +1 @@
3.0.0-SNAPSHOT
3.1.1-SNAPSHOT

View File

@@ -158,7 +158,7 @@ public class Order {
* Get complete
* @return complete
**/
public Boolean isComplete() {
public Boolean getComplete() {
return complete;
}

View File

@@ -108,13 +108,14 @@
"in" : "query",
"description" : "Status values that need to be considered for filter",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string",
"default" : "available",
"enum" : [ "available", "pending", "sold" ]
"enum" : [ "available", "pending", "sold" ],
"default" : "available"
}
}
} ],
@@ -162,6 +163,7 @@
"in" : "query",
"description" : "Tags to filter by",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",

View File

@@ -1 +1 @@
3.0.0-SNAPSHOT
3.1.1-SNAPSHOT

View File

@@ -158,7 +158,7 @@ public class Order {
* Get complete
* @return complete
**/
public Boolean isComplete() {
public Boolean getComplete() {
return complete;
}

View File

@@ -1 +1 @@
3.0.0-SNAPSHOT
3.1.1-SNAPSHOT

View File

@@ -158,7 +158,7 @@ public class Order {
* Get complete
* @return complete
**/
public Boolean isComplete() {
public Boolean getComplete() {
return complete;
}

View File

@@ -108,13 +108,14 @@
"in" : "query",
"description" : "Status values that need to be considered for filter",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string",
"default" : "available",
"enum" : [ "available", "pending", "sold" ]
"enum" : [ "available", "pending", "sold" ],
"default" : "available"
}
}
} ],
@@ -162,6 +163,7 @@
"in" : "query",
"description" : "Tags to filter by",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",

View File

@@ -1 +1 @@
3.0.0-SNAPSHOT
3.1.1-SNAPSHOT

View File

@@ -158,7 +158,7 @@ public class Order {
* Get complete
* @return complete
**/
public Boolean isComplete() {
public Boolean getComplete() {
return complete;
}

View File

@@ -108,13 +108,14 @@
"in" : "query",
"description" : "Status values that need to be considered for filter",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",
"items" : {
"type" : "string",
"default" : "available",
"enum" : [ "available", "pending", "sold" ]
"enum" : [ "available", "pending", "sold" ],
"default" : "available"
}
}
} ],
@@ -162,6 +163,7 @@
"in" : "query",
"description" : "Tags to filter by",
"required" : true,
"style" : "form",
"explode" : false,
"schema" : {
"type" : "array",

View File

@@ -13,6 +13,7 @@ import javax.validation.constraints.*;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -13,6 +13,7 @@ import javax.validation.constraints.*;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -13,6 +13,7 @@ import javax.validation.constraints.*;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -13,6 +13,7 @@ import javax.validation.constraints.*;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -13,6 +13,7 @@ import javax.validation.constraints.*;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -13,6 +13,7 @@ import javax.validation.constraints.*;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -13,6 +13,7 @@ import javax.validation.constraints.*;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -13,6 +13,7 @@ import javax.validation.constraints.*;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -13,6 +13,7 @@ import javax.validation.constraints.*;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),

View File

@@ -13,6 +13,7 @@ import javax.validation.constraints.*;
/**
* Animal
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),