在 Java 后端和 Android 应用程序之间共享 POJO

tom*_*omo 6 java api spring android backend

我正在和我的朋友开发一个 Android 应用程序。我目前负责后端,而她正在研究 Android 部分。后端是使用在 AWS Amazon Cloud? 中运行的 Lambda 函数用 Java 开发的。前端和后端完全解耦(Lambda 函数通过 REST API 公开),除了双方使用的 POJO。POJO 在调用 API 时由应用程序序列化为 JSON,并在处理 API 请求时由后端再次反序列化为 POJO(非常相同)。

出于显而易见的原因,我们希望使双方的 POJO 完全相同,但我们想知道正确的做法是什么。我们看到以下两个选项:

1) 只需复制两边的代码。这具有独立更改公共代码的缺点,这迟早会导致错配。

2) 将 POJO 移出一个单独的库并将其作为依赖项包含在双方中。这似乎是解决此问题的更合适的方法,但是我们如何确保我和我的朋友都知道 POJO 已更改?假设我从 POJO 中删除了一个字段并创建了一个新版本的共享库。我将更改推送到我们的存储库,然后...告诉我的朋友我做了一些更改,因此她应该拉取它们,构建新版本并将其包含在她的项目中?

有没有不同(更好)的方法来解决这个问题?目前后端是用 Maven 构建的,但如果这有助于自动化操作并使我们的代码一致(Android Studio 强制 Gradle 构建),我可以切换到 Gradle。

我发现了其他人的类似问题,但他们要么有点不同,要么没有得到回答:

在 Android 项目和 java 后端项目之间共享 POJO

在 Android 和 Java 后端(gradle)之间共享一个 Java 库

在 Java 后端和 Android 应用程序之间共享代码

cod*_*ood 11

当然还有很多其他方法可以做到这一点,或者更好与否;我会让你考虑的。

但在分享 POJO 之前,我请您退后一步,看看您的架构。你基本上得到了:

  1. 带有 REST API 的 Java 后端,支持 JSON 有效负载
  2. 一个 Android 应用程序,能够进行 REST 调用和反序列化 JSON 有效负载。

如果您注意到,上面的技术堆栈不涉及任何级别的 POJO。你明白我的意思吗?POJO 对您来说是一个实现细节,在您的组件之间共享它是不明智的。

展望未来,在您的架构中添加更多组件如何,例如:

  1. iOS应用
  2. Kotlin 对 Android 应用程序的支持

您分享 POJO 代码的意愿仍然完好无损吗?也许不是。

据我所知,您应该为 REST 后端和支持 REST 的客户端进行设计和开发。就这样。这应该是底线。

因此,回到您在后端和客户端之间共享更新的要求,您可以在两者之间共享 JSON 模式,而不是共享 POJO。此后,使用自动化系统(例如,一个简单的脚本)在后端和客户端生成 POJO

这种方法有一定的好处。例如:

  1. 您现在和将来都可以根据您的要求共享更新。
  2. 这也使您的模块化(或解耦)更好,因为后端和客户端不受使用 POJO 的要求的约束。例如,Data class如果您决定在客户端中使用 Kotlin,则可以使用。
  3. 您可以在将来使用版本化架构,用于客户端无法跟上后端或后端需要独立更新的时间。
  4. 和更多