fix circular reference in inline model (#12894)

This commit is contained in:
William Cheng 2022-07-17 12:43:40 +08:00 committed by GitHub
parent bdd54dacad
commit 0b80444b56
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -157,6 +157,26 @@ public class InlineModelResolver {
* @param schema target schema * @param schema target schema
*/ */
private boolean isModelNeeded(Schema schema) { private boolean isModelNeeded(Schema schema) {
return isModelNeeded(schema, new HashSet<>());
}
/**
* Return false if model can be represented by primitives e.g. string, object
* without properties, array or map of other model (model contanier), etc.
* <p>
* Return true if a model should be generated e.g. object with properties,
* enum, oneOf, allOf, anyOf, etc.
*
* @param schema target schema
* @param visitedSchemas Visited schemas
*/
private boolean isModelNeeded(Schema schema, Set<Schema> visitedSchemas) {
if (visitedSchemas.contains(schema)) { // circular reference
return true;
} else {
visitedSchemas.add(schema);
}
if (resolveInlineEnums && schema.getEnum() != null && schema.getEnum().size() > 0) { if (resolveInlineEnums && schema.getEnum() != null && schema.getEnum().size() > 0) {
return true; return true;
} }
@ -172,7 +192,7 @@ public class InlineModelResolver {
if (m.getAllOf() != null && !m.getAllOf().isEmpty()) { if (m.getAllOf() != null && !m.getAllOf().isEmpty()) {
// check to ensure at least of the allOf item is model // check to ensure at least of the allOf item is model
for (Schema inner : m.getAllOf()) { for (Schema inner : m.getAllOf()) {
if (isModelNeeded(ModelUtils.getReferencedSchema(openAPI, inner))) { if (isModelNeeded(ModelUtils.getReferencedSchema(openAPI, inner), visitedSchemas)) {
return true; return true;
} }
} }