【问题标题】:Spring Boot REST display id of parent only in a JSON responseSpring Boot REST 仅在 JSON 响应中显示父级的 ID
【发布时间】:2015-09-02 12:49:51
【问题描述】:

假设我有以下课程:

public class ChildEntity {

   ...

   @ManyToOne
   private ParentEntity parent;  

   ...

}

现在,我有一个 REST 端点,可以从数据库中检索一个子实体对象,因此我的 JSON 如下:

{"id": "123", "name":"someName", "parent": { //parent fields here } ... }

我想以另一种方式格式化我的 JSON 响应。我希望父级仅显示数据库中的 id,而不是整个对象:

{"id": "123", "name":"someName", "parentId": "1" ... }

【问题讨论】:

    标签: json spring rest spring-boot


    【解决方案1】:

    我正在注释 @JsonIgnore 哪个字段我不想成为 JSON 响应的一部分。为每个实体创建并行 POJO 的成本很高。

    @JsonIgnore
    @NotNull
    @Column(name="DELETED")
    private boolean deleted = false;
    

    【讨论】:

      【解决方案2】:

      基本上直接从端点返回实体并不是一个好主意。您在数据库模型和响应之间建立了非常紧密的耦合。相反,实现一个与您发送的 HTTP 响应等效的 POJO 类。

      此 POJO 将包含所有 ChildEntity 字段和仅 parentId,并将在 HTTP 层中构造。

      请看 cmets 中的讨论,根据我的说法,从 web 层返回的这种对象基本上不是 DTO。

      【讨论】:

      • 请在某处提及 DTO/TO。
      • 基本上我不认为这是一个 DTO/VO/TO。这些对象应该在应用层之间内部使用,而不是返回给最终用户。如本文所述:petrikainulainen.net/software-development/design/…
      • 是的,根据您链接的文章,这样的对象称为 DTO。 “如果我们将我们的领域模型暴露给外界,我们就不能在不破坏依赖它的其他东西的情况下改变它。如果我们使用 DTO,只要我们不对 DTO 进行任何更改,我们就可以改变我们的领域模型。”用于在边界(可能是 IPC 或 REST)之间传输数据的 Imo 对象是 (D)TO。
      • 好吧,你是对的。感谢您指出了这一点。正如我所说,我总是使用这些对象在层之间传递它们。暴露于外部世界的对象通常以*Res*Req 后缀调用。
      • 老实说,在事实证明这可能是一个真正的性能问题之前,我不会打扰。如果您确实需要 id,您可以使用映射器,例如 dozzer。这也绝对取决于这样的项目有多复杂。
      猜你喜欢
      • 2020-11-09
      • 1970-01-01
      • 2017-10-18
      • 2018-07-13
      • 2018-02-10
      • 2017-06-12
      • 1970-01-01
      • 2016-05-01
      • 2020-02-24
      相关资源
      最近更新 更多