我在 Kotlin 中有 Spring 支持的服务,我想在其中使用根据 OpenAPI 3.0 规范生成的接口和模型 DTO。
但是问题来了:使用Spring分页功能的服务,提供了从请求参数(page=0&size=10&sort=[id])到特殊对象Pageable(org.springframework.data.domain.Pageable)的映射
我仍然需要为非 Spring 客户端提供该对象的描述。 它在 yaml 中定义为 Pageable。
Pageable:
type: object
properties:
page:
type: integer
format: int32
default: 0
size:
type: integer
format: int32
default: 10
sort:
type: array
items:
type: string
default: ["id"]
但是在服务器代码中,我想使用Spring原生对象,包括生成的接口定义。
在 Gradle 任务参数中,我使用导入映射将 api-spec 对象替换为 Spring 数据对象:
importMappings.put("Pageable", "org.springframework.data.domain.Pageable")
因此,接口定义使用正确的类(来自 Spring,而不是生成)。 但是DTO类仍然在目录中生成,并且有奇怪的名称“data class org.springframework.data.domain.Pageable”
data class org.springframework.data.domain.Pageable(
@Schema(example = "null", description = "")
@get:JsonProperty("page") val page: kotlin.Int? = 0,
@Schema(example = "null", description = "")
@get:JsonProperty("size") val propertySize: kotlin.Int? = 10,
@Schema(example = "null", description = "")
@get:JsonProperty("sort") val sort: kotlin.collections.List<kotlin.String>? = arrayListOf("id")
)
这是错误的,它会导致编译错误,所以我需要删除这个生成的文件以使整个项目可以编译。 有没有办法告诉 openapi 生成器不生成某些文件? 另外,typeMapping 和 importMapping 有什么区别?我认为第一个替换了 type (类名) ,第二个替换了仅导入引用。但事实上,importMapping 两者兼而有之,从而产生了不必要的副作用。
除了
importMappings
之外,您还应该在此用例中使用 schemaMappings
。这告诉生成器,您的 OAS 中的模式 Pageable
对应于 org.springframework.data.domain.Pageable
并且不需要生成。