解决Springdoc-OAS3中Schema重复的问题
在使用springdoc-openapi
时,如果项目中存在多个SimpleName一致的Class,
那在Schema描述中将会依照解析的先后顺序互相覆盖,从而导致Api文档的描述与预期不一致。
相似问题
解决方案
- 启用
springdoc.use-fqn
属性,所有的类将解析为全限定名 - 重写
TypeNameResolver
,自定义解析规则
重写TypeNameResolver
需要注意的是,父类中useFqn被限定为private
,在子类中无法获取。因此重写的逻辑(除super.getNameOfClass(cls)
外)无法对开启useFqn
的情况做出适配。
1 |
|
替换掉原本的TypeNameResolver
- 原本的
TypeNameResolver
是个私有静态单例,上面还打了final
标记,看起来是没有替换原本变量的可能了。 - 往上一层走到
ModelResolver
类中,这个类提供了两个构造,其中一个支持传入TypeNameResolver
参数,可以从这里入手覆盖。 ModelResolver
是被ModelResolvers
初始化的,虽然ModelConverters
也是个私有静态单例改不掉他,但他本质是个对List<ModelConverter>
的包装类,提供了操作其中converters
的方法,所以我们可以通过操作内部的数组来放入自定义的TypeNameResolver
。- 由于
ModelConverters
也是静态单例,只要在Spring调用它解析Model之前替换调原本的TypeNameResolver
就行了,因此可以直接怼到启动类中。
1 |
|
重启项目后,打开openapi文档。相同SimpleName的Schema已经区分来了。