我正在和朋友一起开发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)
答案 0 :(得分:1)
当然,还有很多其他方法可以做到这一点,或者更好或没有。我将留给您考虑。
但是在共享POJO之前,我请您向后退一步,看看您的体系结构。您基本上有:
如果您在上面注意到,技术堆栈在任何级别上都不涉及POJO。 你明白我的意思吗? POJO对您来说是一个实现细节,在您的组件之间共享它是不明智的。
如何展望在将来向架构中添加更多组件的未来,说:
您分享POJO代码的意愿是否仍然完整?也许不是。
据我所知,您应该为REST后端和具有REST功能的客户端进行设计和开发。就这样。那应该是底线。
因此,回到您在后端和客户端之间共享更新的要求之后,您可以在两者之间共享JSON模式,而不是共享POJO。然后,使用自动化系统(例如,简单的脚本)在后端和客户端中生成POJO 。
这种方法可以带来某些好处。例如:
Data class
。 答案 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 的首选。