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

标签 java android spring api backend

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

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

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

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

有没有不同的(更好的)方法来解决这个问题?目前后端是用 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 之前,我要求您退后一步,看看您的架构。你基本上得到了:

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

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

    展望 future ,在架构中添加更多组件,例如:
  • iOS 应用
  • Kotlin 对 Android 应用程序的支持

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

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

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

    这种方法可以有一定的好处。例如:
  • 您将能够根据您的要求在现在和将来共享更新。
  • 这也使您的模块化(或解耦)更好,因为后端和客户端不受使用 POJO 的要求的约束。例如,您可以使用 Data class如果您决定在客户端中使用 Kotlin。
  • 您可以在将来使用版本化模式,以应对客户端无法跟上后端或后端需要独立更新的情况。
  • 和更多
  • 关于java - 在 Java 后端和 Android 应用程序之间共享 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53489744/

    相关文章:

    java - 在Java中,将字符串数组转换为 float 组的最快、最简单的方法是什么?

    java - @Before 注释在 espresso 测试中被 kotlin 忽略?

    java - Guice:将 Class<?> 绑定(bind)到 Class<?>

    java - Spring JPA 中 NamedStoredProcedureQuery 中的错误 - "Found named stored procedure parameter associated with positional parameters"

    android - admob:如何在 UI 线程之外加载 AdRequest?

    android - 约束布局的子边距

    spring - org.springframework.beans.factory.BeanCreationException 创建 ServletContext 中定义的名称为 'sessionFactory' 的 bean 时出错

    Spring 启动两个对象映射器 bean

    model-view-controller - 数据模型中的Spring Formatters,这是否违反了MVC?有更好的选择吗?

    java - Java 中的 Lambda 与迭代器