为什么我要将repo级别对象与控制器/服务级别对象混合使用?

时间:2018-01-26 15:27:08

标签: java spring-mvc spring-data-jpa microservices spring-data-mongodb

我在许多微服务上工作,并且看到我们不将repo级别对象(mogo文档,实体)与服务/控制器级别请求/响应混合。我想知道更多关于它的信息? 1.我们不希望pojo和实体/文档以同样的方式表现吗?(可能是一个原因) 请帮助我理解这样做的原因。

2 个答案:

答案 0 :(得分:1)

如果您需要分离实体(或一般的持久性对象)和公共接口响应(例如REST等),则很大程度上取决于您的应用程序设计。

如果持久性对象仅包含简单的非敏感数据,则也可以将它们用于公共接口响应。但是这里有一些需要单独对象的场景:

  1. 您的持久性对象包含要由外部读取的敏感数据(密码,加密密钥等)。然后,您将这些对象转换为其他类型并剥离该数据以将其从公共接口中隐藏。

  2. 您在持久性对象(实体之间的关系等)中嵌套了引用,这些引用非常深,甚至可以形成循环。如果您尝试将这些序列化为传输格式(例如JSON),则该过程将因循环失败或您的JSON对象将很大。然后通过仅包含ID或其他任何作为嵌套引用来转换对象和删除循环更容易。

  3. 在我开发的一些应用程序中,我甚至更进了一步,确定了三个不同的数据对象层。第一层是持久层,可以是实体,YAML或JSON表示或类似的东西。

    由于应用程序使用了大量不同的存储后端,并支持多个相同的数据,因此我将这些特定对象转换为通用域对象,形成第二层。应用程序本身仅适用于这些域对象,从不接触直接持久化对象。

    第三层是装饰层,我用它来隐藏或简化REST接口输出的信息。它们用于对抗上述两种情况。

答案 1 :(得分:1)

绝对可以做到这一点,尤其是在小型项目或演示项目中。

假设您正在进行Web应用程序。 对于复杂的企业应用程序,大多数时候您希望公开某些字段和某些格式的数据,再加上一个数据对象的吸引力,您可以避免更改实体字段和数据库表字段。