Kotlin Spring Boot后端与Kotlin Android端如何共享数据模型?
Kotlin Spring Boot后端与Kotlin Android端如何共享数据模型?
嘿,这个问题我太有共鸣了!用Kotlin同时写Spring Boot后端和Android端时,重复定义数据模型不仅浪费时间,还很容易因为字段不一致导致序列化/反序列化bug,下面给你几个在实际开发中验证过的靠谱方案:
1. 独立共享Gradle模块(最直接的入门方案)
这是大多数团队初期的首选,因为两者都是基于Gradle构建,配置成本极低:
- 在项目根目录下新建一个纯Kotlin的Gradle模块,比如命名为
shared-models,选择「Java/Kotlin Library」类型,绝对不要引入任何Android或Spring相关的依赖 - 把所有共用的数据模型(比如
data class User(val id: Long, val name: String, val email: String))都放在这个模块的src/main/kotlin目录下,只保留纯Kotlin核心代码,避免添加平台特定注解(比如Spring的@Entity或Android的@Parcelable) - 在Spring Boot项目的
build.gradle.kts中添加依赖:implementation(project(":shared-models")) - 在Android项目的Module级别
build.gradle.kts中添加依赖:implementation(project(":shared-models")) - 进阶技巧:如果需要平台特定功能,可以在各自项目中扩展共享模型。比如Spring端给共享的
User类额外添加@Entity和JPA注解,Android端给User添加@Parcelize注解(需开启Kotlin扩展),核心字段结构完全共享,不会重复定义
2. Kotlin Multiplatform(KMP)模块(官方推荐的跨平台方案)
如果你的项目有长期跨平台扩展需求,KMP是更灵活的选择,能完美兼顾两端的平台特性:
- 创建一个KMP模块,目标平台指定
jvm(给Spring Boot用)和android(或androidJvm) - 共享的数据模型放在
commonMain目录下,写纯Kotlin核心代码,比如:// commonMain/kotlin/com/example/models/User.kt data class User( val id: Long, val name: String, val email: String? ) - 用
expect/actual机制处理平台特定需求:比如Spring需要Jackson序列化注解,Android需要Parcelable,可以在commonMain定义expect的接口或注解,然后在jvmMain(Spring端)和androidMain(Android端)中实现actual版本 - 配置完成后,Spring和Android项目都可以直接依赖这个KMP模块,既能共享核心模型,又能满足各自平台的序列化、组件传递需求
3. 代码生成工具(适合模型变更频率低的场景)
如果不想维护多模块结构,可以用代码生成工具自动同步两端的模型:
- 基于OpenAPI/Swagger:先在Spring Boot后端通过OpenAPI注解定义API和数据模型,然后用OpenAPI Generator生成Android端的Kotlin数据模型;也可以先编写统一的OpenAPI YAML/JSON配置文件,再同时生成两端的模型代码
- 自定义注解处理器:用Kotlin的
kapt写一个简单的注解处理器,从共享的元数据(比如JSON Schema、配置文件)自动生成两端的数据模型类 - 注意:这个方法的缺点是模型变更后需要重新生成代码,不如前两个方案实时同步方便
关键注意事项
- 保持共享模型的纯净性:不要在共享代码中引入平台依赖,避免出现Spring和Android的依赖冲突
- 统一序列化框架:两端尽量用相同的序列化库,比如都用
kotlinx-serialization或Jackson,确保字段名、空值处理、枚举规则完全一致 - 版本同步:共享模块的版本要和两端项目保持同步,避免因版本不一致导致的编译错误
这些方案我在多个项目中都实践过,前两个是最常用的——如果只是简单共享模型,独立Gradle模块足够;如果有长期跨平台规划,KMP会是更长远的选择!
内容来源于stack exchange
相关产品推荐
相关产品推荐

