Fabrikt:从OpenApi3规范生成Kotlin代码的强大工具

Fabrikt:从OpenApi3规范生成Kotlin代码的强大工具

fabriktGenerates Kotlin Code from OpenApi3 Specifications项目地址:https://gitcode.com/gh_mirrors/fa/fabrikt

项目介绍

Fabrikt是一款专为OpenApi3规范设计的Kotlin代码生成工具。它不仅能够生成基础的Kotlin数据类,还支持多种高级特性,如空安全、内联模式定义、枚举、密封类、多态性、复杂映射结构、GraalVM原生反射注册、Json Merge Patch等。Fabrikt不仅限于代码生成,还可以无缝集成到Gradle或Maven构建中,确保API规范与代码始终保持一致,即使API随着时间的推移变得更加复杂。

项目技术分析

Fabrikt的核心优势在于其对OpenApi3模型的深度利用。它通过KaiZen-OpenApi-Parser解析OpenApi3规范,并使用Kotlin Poet以编程方式构建Kotlin类。这种非模板化的生成方式提供了极大的灵活性,能够处理复杂的API模型。

项目及技术应用场景

Fabrikt特别适用于遵循Zalando的REST API指南的API开发。它能够生成Jackson注解的数据类、Spring MVC注解的控制器接口、Ktor服务器路由和控制器接口,以及OkHttp客户端。这些生成的代码可以直接用于生产环境,减少了手动编写和维护代码的工作量。

项目特点

  1. 高级特性支持:Fabrikt支持多种高级特性,如空安全、多态性、复杂映射结构等,确保生成的代码具有高度的灵活性和可维护性。
  2. 无缝集成:可以永久集成到Gradle或Maven构建中,确保API规范与代码始终保持一致。
  3. 丰富的生成选项:支持生成Jackson注解的数据类、Spring MVC控制器、Ktor服务器路由和OkHttp客户端,满足不同场景的需求。
  4. 生产环境验证:由Zalando Tech开发并在生产环境中经过实战测试,可靠性高。

使用示例

以下是一个使用allOf生成多态Kotlin数据类的示例:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.EXISTING_PROPERTY,
    property = "some_enum",
    visible = true
)
@JsonSubTypes(
    JsonSubTypes.Type(
        value = DiscriminatedChild1::class,
        name =
        "obj_one_only"
    ),
    JsonSubTypes.Type(
        value = DiscriminatedChild2::class,
        name =
        "obj_two_first"
    ),
    JsonSubTypes.Type(
        value = DiscriminatedChild2::class,
        name =
        "obj_two_second"
    ),
    JsonSubTypes.Type(value = DiscriminatedChild3::class, name = "obj_three")
)
sealed class ChildDefinition() {
    abstract val someEnum: ChildDiscriminator
}

enum class ChildDiscriminator(
    @JsonValue
    val value: String
) {
    OBJ_ONE_ONLY("obj_one_only"),

    OBJ_TWO_FIRST("obj_two_first"),

    OBJ_TWO_SECOND("obj_two_second"),

    OBJ_THREE("obj_three");

    companion object {
        private val mapping: Map<String, ChildDiscriminator> =
            values().associateBy(ChildDiscriminator::value)

        fun fromValue(value: String): ChildDiscriminator? = mapping[value]
    }
}

data class DiscriminatedChild1(
    @param:JsonProperty("some_prop")
    @get:JsonProperty("some_prop")
    val someProp: String? = null,
    @get:JsonProperty("some_enum")
    @get:NotNull
    override val someEnum: ChildDiscriminator = ChildDiscriminator.OBJ_ONE_ONLY
) : ChildDefinition()

data class DiscriminatedChild2(
    @get:JsonProperty("some_enum")
    @get:NotNull
    override val someEnum: ChildDiscriminator,
    @param:JsonProperty("some_prop")
    @get:JsonProperty("some_prop")
    val someProp: String? = null
) : ChildDefinition()

data class DiscriminatedChild3(
    @get:JsonProperty("some_enum")
    @get:NotNull
    override val someEnum: ChildDiscriminator = ChildDiscriminator.OBJ_THREE
) : ChildDefinition()

data class Responses(
    @param:JsonProperty("entries")
    @get:JsonProperty("entries")
    @get:Valid
    val entries: List<ChildDefinition>? = null
)

使用说明

Fabrikt提供了丰富的CLI参数,用于控制生成的代码。例如,可以使用--api-file指定OpenApi3规范文件,使用--base-package指定生成的代码的基础包名等。详细的参数说明可以通过运行./gradlew printCodeGenUsage获取。

总结

Fabrikt是一款功能强大且灵活的Kotlin代码生成工具,特别适合需要处理复杂API模型的开发场景。它不仅能够生成高质量的Kotlin代码,还能确保API规范与代码的一致性,是开发者的得力助手。

fabriktGenerates Kotlin Code from OpenApi3 Specifications项目地址:https://gitcode.com/gh_mirrors/fa/fabrikt

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗廷国Kenyon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值