我使用kotlin + Jersey和swagger文档生成器,方法为code first
.
我有两个DTO
enum class DataType {
FIRST, SECOND;
}
data class Data1(type: DataType)
data class Data2(type: DataType)
gradle依赖
implementation("io.swagger.core.v3:swagger-jaxrs2-jakarta:2.2.6")
文档的预期结果:
components:
schemas:
DataType:
type: string
enum: [ FIRST, SECOND ]
Data1:
type: object
properties:
type:
$ref: '#/components/schemas/DataType'
Data2:
type: object
properties:
type:
$ref: '#/components/schemas/DataType'
实际结果
components:
schemas:
Data1:
type: object
properties:
type:
type: string
enum: [ FIRST, SECOND ]
Data2:
type: object
properties:
type:
type: string
enum: [ FIRST, SECOND ]
问题是,如果任何客户端重用schema来为自己的应用生成类,他就会为type属性获得两个单独的enum类。
Q:如何使生成器检测到它是相同的enum和提取它单独的类型引用?
好的,我自己找到了一个方法
import io.swagger.v3.core.jackson.ModelResolver.SET_PROPERTY_OF_ENUMS_AS_REF
init {
System.setProperty(SET_PROPERTY_OF_ENUMS_AS_REF, "any value")
}
另一种方法是实现自定义ModelResolver
,但是类的实现看起来相当复杂
UDPATE刚刚注意到,ModelResolver
中的public static boolean enumsAsRef = System.getProperty("enums-as-ref") != null;
不是最终的。我们可以做更简单的
init {
io.swagger.v3.core.jackson.ModelResolver.enumsAsRef = true
}