在 Java 后端和 Android 应用程序之间共享 POJO
Sharing POJOs between Java backend and an Android application
我正在和朋友一起开发 Android 应用程序。我目前负责后端,而她正在处理 Android 部分。后端是在 Java 中使用 AWS Amazon Cloud 中的 Lambda 函数 运行 开发的。前端和后端完全解耦(Lambda 函数通过 REST APIs 公开),除了两侧使用的 POJO。 POJO 在调用 API 时由应用程序序列化为 JSON,在处理 API 请求时由后端再次反序列化为 POJO(完全相同的)。
出于显而易见的原因,我们希望让两侧的 POJO 完全相同,但我们想知道这样做的正确方法是什么。我们看到以下两个选项:
1) 两边直接复制代码即可。这有独立更改公共代码的缺点,迟早会导致错位。
2) 将 POJO 移出到一个单独的库中,并将其作为双方的依赖项包含在内。这似乎是解决此问题的更合适的方法,但我们如何确保我和我的朋友都知道 POJO 已被更改?假设我从 POJO 中删除了一个字段并创建了一个新版本的共享库。我将更改推送到我们的存储库,然后...告诉我的朋友我做了一些更改,所以她应该拉取它们,构建新版本并将其包含在她的项目中?
有没有不同的(更好的)方法来解决这个问题?目前后端是用 Maven 构建的,但我可以切换到 Gradle 如果这有助于自动化并使我们的代码一致(Android Studio 强制 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
当然还有很多其他方法可以做到这一点,无论好坏;我会留给你考虑。
但在分享 POJO 之前,我请您退后一步,看看您的架构。你基本上得到了:
- a Java 带有 REST API 的后端,支持 JSON 有效载荷
- 一个 Android 应用程序,能够进行 REST 调用和反序列化 JSON 有效负载。
如果您在上面注意到,技术堆栈在任何级别上都不涉及 POJO。
你明白我的意思吗? POJO 是您的实现细节,在您的组件之间共享它是不明智的。
展望未来,在架构中添加更多组件,例如:
- iOS申请
- Kotlin 支持 Android 应用程序
您分享 POJO 代码的意愿还会保持不变吗?也许不是。
据我所知,您应该为 REST 后端和支持 REST 的客户端进行设计和开发。就这样。这应该是底线。
因此,回到您在后端和客户端之间共享更新的要求,您可以在两者之间共享 JSON 架构 ,而不是共享 POJO。然后,使用自动化系统(例如,一个简单的脚本)在后端和客户端生成 POJO。
这种方法有一定的好处。例如:
- 您现在和将来都可以根据您的要求共享更新。
- 这也使您的模块化(或解耦)更好,因为后端和客户端不受使用 POJO 的要求的约束。例如,如果您决定在客户端中使用 Kotlin,则可以使用
Data class
。
- 您可以在将来使用版本化架构,以防客户端跟不上后端,或者后端需要独立更新。
- 还有更多
除了上面的答案之外,我会利用这两种语言都使用 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 版本中默认禁用(包已包含但 'hidden'),但最后一篇链接在上面的段落讨论了 可接受的 解决方法。 IMO 它仍然是在 Java.
中使用 Json 的首选选项
我正在和朋友一起开发 Android 应用程序。我目前负责后端,而她正在处理 Android 部分。后端是在 Java 中使用 AWS Amazon Cloud 中的 Lambda 函数 运行 开发的。前端和后端完全解耦(Lambda 函数通过 REST APIs 公开),除了两侧使用的 POJO。 POJO 在调用 API 时由应用程序序列化为 JSON,在处理 API 请求时由后端再次反序列化为 POJO(完全相同的)。
出于显而易见的原因,我们希望让两侧的 POJO 完全相同,但我们想知道这样做的正确方法是什么。我们看到以下两个选项:
1) 两边直接复制代码即可。这有独立更改公共代码的缺点,迟早会导致错位。
2) 将 POJO 移出到一个单独的库中,并将其作为双方的依赖项包含在内。这似乎是解决此问题的更合适的方法,但我们如何确保我和我的朋友都知道 POJO 已被更改?假设我从 POJO 中删除了一个字段并创建了一个新版本的共享库。我将更改推送到我们的存储库,然后...告诉我的朋友我做了一些更改,所以她应该拉取它们,构建新版本并将其包含在她的项目中?
有没有不同的(更好的)方法来解决这个问题?目前后端是用 Maven 构建的,但我可以切换到 Gradle 如果这有助于自动化并使我们的代码一致(Android Studio 强制 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
当然还有很多其他方法可以做到这一点,无论好坏;我会留给你考虑。
但在分享 POJO 之前,我请您退后一步,看看您的架构。你基本上得到了:
- a Java 带有 REST API 的后端,支持 JSON 有效载荷
- 一个 Android 应用程序,能够进行 REST 调用和反序列化 JSON 有效负载。
如果您在上面注意到,技术堆栈在任何级别上都不涉及 POJO。 你明白我的意思吗? POJO 是您的实现细节,在您的组件之间共享它是不明智的。
展望未来,在架构中添加更多组件,例如:
- iOS申请
- Kotlin 支持 Android 应用程序
您分享 POJO 代码的意愿还会保持不变吗?也许不是。
据我所知,您应该为 REST 后端和支持 REST 的客户端进行设计和开发。就这样。这应该是底线。
因此,回到您在后端和客户端之间共享更新的要求,您可以在两者之间共享 JSON 架构 ,而不是共享 POJO。然后,使用自动化系统(例如,一个简单的脚本)在后端和客户端生成 POJO。
这种方法有一定的好处。例如:
- 您现在和将来都可以根据您的要求共享更新。
- 这也使您的模块化(或解耦)更好,因为后端和客户端不受使用 POJO 的要求的约束。例如,如果您决定在客户端中使用 Kotlin,则可以使用
Data class
。 - 您可以在将来使用版本化架构,以防客户端跟不上后端,或者后端需要独立更新。
- 还有更多
除了上面的答案之外,我会利用这两种语言都使用 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 版本中默认禁用(包已包含但 'hidden'),但最后一篇链接在上面的段落讨论了 可接受的 解决方法。 IMO 它仍然是在 Java.
中使用 Json 的首选选项