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

时间:2018-11-26 21:58:58

标签: android build frontend backend pojo

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

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

1)只需在两面复制代码。这样做的缺点是必须独立更改通用代码,迟早会导致误报。

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

有没有其他(更好)的方法来解决此问题?目前,后端是使用Maven构建的,但是如果这可以帮助实现自动化并使代码保持一致(Android Studio会强制Gradle构建),我可以切换到Gradle。

我发现其他人也有类似的问题,但是它们有些不同或者仍然没有答案:

Sharing POJOs between Android project and java backend project

Sharing one java library between Android and Java backend (gradle)

Sharing code between Java backend and Android app

2 个答案:

答案 0 :(得分:1)

当然,还有很多其他方法可以做到这一点,或者更好或没有。我将留给您考虑。

但是在共享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的要求的约束。例如,如果决定在客户端中使用Kotlin,则可以使用Data class
  3. 您可以在将来,客户端无法跟上后端或后端需要独立更新的时候使用版本化架构。
  4. 更多

答案 1 :(得分:0)

添加到上面的答案中,我将利用两种语言都使用 Java 编译器和 API 的事实。无论前端使用 Java 还是 Kotlin,您都可以直接调用这些 api 库中的任何一个 from your code

特别是一个 api,Json-B,提供了将 Java(或 Kotlin)对象转换为 Json 进行传输的方法,然后在另一端将 Json 响应转换回 Java/Kotlin。

一个警告:我最近听说至少部分 javax.* 包被安排弃用。它们应该适用于 Java 14 或更低版本,但如果您计划在未来进行更新,您需要考虑这一点。

对于 Java 9 或更新版本,您还应该先阅读 this。它会为您节省一些时间。

编辑:事实上,Json-B 在较新的 Java 版本中默认被禁用(该包被包含但“隐藏”),但上一段中链接的最后一篇文章谈到了可接受解决方法。 IMO 它仍然是在 Java 中使用 Json 的首选。