有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用springdoc处理递归模型的java

所以我有一个嵌套的模型结构,看起来像这样:

public class TagArea {
    private List<TagGroup> groups;
    
    ... constructors, getters, setters, etc.
}


public class TagGroup {
    private String tagName;
    private List<TagGroup> subgroups;
    
    ... constructors, getters, setters, etc.
}

以及返回所述模型的控制器。然而,模式部分的招摇过市。生成的json如下所示:

{ "components": 
  { "schemas": {
    "TaxonomyClientMetadata": {
      "type": "object", "properties": {
        "tagGroups": {"type": "array", "items": {"$ref": "#/components/schemas/TagGroup"}}
      }
    }, 
    "TagGroup": {
      "type": "object", "properties": {
        "tagName": {"type": "string"}
      }
    }
  }
}

整个财产只是。。。跑了。我希望TagGroup对象看起来更像这样:

"TagGroup": {
  "type": "object", "properties": {
    "tagName": {"type": "string"},
    "subgroups": {"type": "array", "items": {"$ref": "#/components/schemas/TagGroup"}}
  }
}

事实上,我目前正在使用OAS3从Springfox 3.0之前的版本(so Swagger 2)迁移到Springdoc,这是我之前在Springfox中观察到的行为,我希望再次得到支持

这可能与转换到OAS3有关,但我找不到任何资源表明规范不再允许递归类型。我目前也不使用最新版本的springdoc(使用1.4.8),因为它依赖于稍旧的springboot版本

仔细研究一下代码,它看起来像是ModelConverterContextImpl保留了一个processedTypes缓存(我认为范围是当前模式),然后在处理完类型后将它们添加到映射缓存中。在这个场景中,我们开始处理List<TagGroup>(并将List<TagGroup>添加到processedTypes缓存中),这需要递归地处理其中的模式。在处理标记组时,我们找到另一个List<TagGroup>,我们看到它在processedTypes的缓存中,然后从映射缓存中获取它。但是,因为我们从未完成对原始List<TagGroup>的处理,所以它没有被添加到映射缓存中。因此,返回null,并且在ModelResolver中忽略该属性


共 (1) 个答案

  1. # 1 楼答案

    您应该添加@JsonBackReferencejackson注释,用于循环引用解析: springdoc openapi构建在swagger core之上,它基于Jackson库来解析模型模式

    如果使用以下定义,它将按预期工作:

    @Data
    public class TagGroup {
        private String tagGroupName;
    
        @JsonBackReference
        private List<TagGroup> subgroups;
    
    }