forked from loafle/openapi-generator-original
auto fix self-reference schemas
This commit is contained in:
parent
462f450366
commit
d1ca82cb8b
@ -493,12 +493,64 @@ public class OpenAPINormalizer {
|
||||
}
|
||||
}
|
||||
|
||||
// auto fix self reference schema to avoid stack overflow
|
||||
fixSelfReferenceSchema(schemaName, schema);
|
||||
|
||||
// normalize the schemas
|
||||
schemas.put(schemaName, normalizeSchema(schema, new HashSet<>()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Auto fix a self referencing schema using any type to replace the self-referencing sub-item.
|
||||
*
|
||||
* @param name Schema name
|
||||
* @param schema Schema
|
||||
*/
|
||||
public void fixSelfReferenceSchema(String name, Schema schema) {
|
||||
if (ModelUtils.isArraySchema(schema)) {
|
||||
if (isSelfReference(name, schema.getItems())) {
|
||||
LOGGER.error("Array schema {} has a sub-item referencing itself. Worked around the self-reference schema using any type instead.", name);
|
||||
schema.setItems(new Schema<>());
|
||||
}
|
||||
}
|
||||
|
||||
if (ModelUtils.isOneOf(schema)) {
|
||||
for (int i = 0; i < schema.getOneOf().size(); i++) {
|
||||
if (isSelfReference(name, (Schema) schema.getOneOf().get(i))) {
|
||||
LOGGER.error("oneOf schema {} has a sub-item referencing itself. Worked around the self-reference schema by removing it.", name);
|
||||
schema.getOneOf().remove(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ModelUtils.isAnyOf(schema)) {
|
||||
for (int i = 0; i < schema.getAnyOf().size(); i++) {
|
||||
if (isSelfReference(name, (Schema) schema.getAnyOf().get(i))) {
|
||||
LOGGER.error("anyOf schema {} has a sub-item referencing itself. Worked around the self-reference schema by removing it.", name);
|
||||
schema.getAnyOf().remove(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (schema.getAdditionalProperties() != null && schema.getAdditionalProperties() instanceof Schema) {
|
||||
if (isSelfReference(name, (Schema) schema.getAdditionalProperties())) {
|
||||
LOGGER.error("Schema {} (with additional properties) has a sub-item referencing itself. Worked around the self-reference schema using any type instead.", name);
|
||||
schema.setAdditionalProperties(new Schema<>());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private boolean isSelfReference(String name, Schema subSchema) {
|
||||
if (subSchema != null && name.equals(ModelUtils.getSimpleRef(subSchema.get$ref()))) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalizes a schema
|
||||
*
|
||||
|
@ -1493,7 +1493,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
|
||||
MediaType mediaType = content.values().iterator().next();
|
||||
if (mediaType.getExample() != null) {
|
||||
if (isModel) {
|
||||
LOGGER.warn("Ignoring complex example on request body");
|
||||
once(LOGGER).warn("Ignoring complex example on request body");
|
||||
} else {
|
||||
codegenParameter.example = mediaType.getExample().toString();
|
||||
return;
|
||||
@ -1504,7 +1504,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
|
||||
Example example = mediaType.getExamples().values().iterator().next();
|
||||
if (example.getValue() != null) {
|
||||
if (isModel) {
|
||||
LOGGER.warn("Ignoring complex example on request body");
|
||||
once(LOGGER).warn("Ignoring complex example on request body");
|
||||
} else {
|
||||
codegenParameter.example = example.getValue().toString();
|
||||
return;
|
||||
|
@ -1066,3 +1066,24 @@ components:
|
||||
- $ref: '#/components/schemas/SimpleModelWithArrayProperty'
|
||||
myObject:
|
||||
type: object
|
||||
SelfReference:
|
||||
type: array
|
||||
items:
|
||||
$ref: "#/components/schemas/SelfReference"
|
||||
SelfReferenceOneOf:
|
||||
oneOf:
|
||||
- type: string
|
||||
- type: boolean
|
||||
- $ref: "#/components/schemas/SelfReferenceOneOf"
|
||||
SelfReferenceAnyOf:
|
||||
anyOf:
|
||||
- type: string
|
||||
- type: boolean
|
||||
- $ref: "#/components/schemas/SelfReferenceAnyOf"
|
||||
SelfReferenceAdditionalProperties:
|
||||
type: object
|
||||
additionalProperties:
|
||||
$ref: "#/components/schemas/SelfReferenceAdditionalProperties"
|
||||
properties:
|
||||
dummy:
|
||||
type: string
|
||||
|
@ -24,6 +24,9 @@ docs/Pet.md
|
||||
docs/PetApi.md
|
||||
docs/RefRefToPathLevelParameterOneofRefToOneofParameter.md
|
||||
docs/RefToRefParameterAnyofRefToAnyofParameter.md
|
||||
docs/SelfReferenceAdditionalProperties.md
|
||||
docs/SelfReferenceAnyOf.md
|
||||
docs/SelfReferenceOneOf.md
|
||||
docs/SimpleModelWithArrayProperty.md
|
||||
docs/StoreApi.md
|
||||
docs/StringOrInt.md
|
||||
@ -82,6 +85,9 @@ src/main/java/org/openapitools/client/model/Order.java
|
||||
src/main/java/org/openapitools/client/model/Pet.java
|
||||
src/main/java/org/openapitools/client/model/RefRefToPathLevelParameterOneofRefToOneofParameter.java
|
||||
src/main/java/org/openapitools/client/model/RefToRefParameterAnyofRefToAnyofParameter.java
|
||||
src/main/java/org/openapitools/client/model/SelfReferenceAdditionalProperties.java
|
||||
src/main/java/org/openapitools/client/model/SelfReferenceAnyOf.java
|
||||
src/main/java/org/openapitools/client/model/SelfReferenceOneOf.java
|
||||
src/main/java/org/openapitools/client/model/SimpleModelWithArrayProperty.java
|
||||
src/main/java/org/openapitools/client/model/StringOrInt.java
|
||||
src/main/java/org/openapitools/client/model/Tag.java
|
||||
|
@ -166,6 +166,9 @@ Class | Method | HTTP request | Description
|
||||
- [Pet](docs/Pet.md)
|
||||
- [RefRefToPathLevelParameterOneofRefToOneofParameter](docs/RefRefToPathLevelParameterOneofRefToOneofParameter.md)
|
||||
- [RefToRefParameterAnyofRefToAnyofParameter](docs/RefToRefParameterAnyofRefToAnyofParameter.md)
|
||||
- [SelfReferenceAdditionalProperties](docs/SelfReferenceAdditionalProperties.md)
|
||||
- [SelfReferenceAnyOf](docs/SelfReferenceAnyOf.md)
|
||||
- [SelfReferenceOneOf](docs/SelfReferenceOneOf.md)
|
||||
- [SimpleModelWithArrayProperty](docs/SimpleModelWithArrayProperty.md)
|
||||
- [StringOrInt](docs/StringOrInt.md)
|
||||
- [Tag](docs/Tag.md)
|
||||
|
@ -1160,6 +1160,22 @@ components:
|
||||
- $ref: '#/components/schemas/SimpleModelWithArrayProperty'
|
||||
myObject:
|
||||
type: object
|
||||
SelfReference:
|
||||
items: {}
|
||||
type: array
|
||||
SelfReferenceOneOf:
|
||||
oneOf:
|
||||
- type: string
|
||||
- type: boolean
|
||||
SelfReferenceAnyOf:
|
||||
anyOf:
|
||||
- type: string
|
||||
- type: boolean
|
||||
SelfReferenceAdditionalProperties:
|
||||
additionalProperties: {}
|
||||
properties:
|
||||
dummy:
|
||||
type: string
|
||||
updatePetWithForm_request:
|
||||
properties:
|
||||
name:
|
||||
|
@ -137,6 +137,9 @@ public class JSON {
|
||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Pet.CustomTypeAdapterFactory());
|
||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.RefRefToPathLevelParameterOneofRefToOneofParameter.CustomTypeAdapterFactory());
|
||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.RefToRefParameterAnyofRefToAnyofParameter.CustomTypeAdapterFactory());
|
||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.SelfReferenceAdditionalProperties.CustomTypeAdapterFactory());
|
||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.SelfReferenceAnyOf.CustomTypeAdapterFactory());
|
||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.SelfReferenceOneOf.CustomTypeAdapterFactory());
|
||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.SimpleModelWithArrayProperty.CustomTypeAdapterFactory());
|
||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.StringOrInt.CustomTypeAdapterFactory());
|
||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Tag.CustomTypeAdapterFactory());
|
||||
|
Loading…
x
Reference in New Issue
Block a user