【问题标题】:Convert Spring Entity objects to modified JSON Object将 Spring Entity 对象转换为修改后的 JSON 对象
【发布时间】:2018-07-26 06:20:39
【问题描述】:

我的数据库中有几张表。员工、地址、电话号码

Table Employee
====================
ID | Emp_Name | Address_id | Phones_id

Table Address
====================
ID | Block_no | City | State

Table Phone_id
====================
ID | Phone_1 | Phone_2 | Phone_3

当我显示直接从存储库接收的 JSON 时,它可以工作,但不是 UI 预期的格式。 我希望对收到的 JSON 进行一些更改。基本上,转换它,然后通过 REST 提供响应。

所以我的问题是:

  1. 有什么 Spring 方法可以解决我的要求。这样我就可以将我的实体类映射到某个 JSON 类。

  2. 是否有任何设计模式可以用于这种场景。

非常感谢!

【问题讨论】:

  • 您是否尝试过在实体类的字段中使用来自 Jackson 的 @JsonProperty
  • 您能否详细说明您尝试对 JSON 进行哪些更改?一个样本将帮助我们回答您的问题。
  • 您能否发布您的 Employee、Phone、Address 类的源代码,以便我们看到您的 Jackson 注释?
  • 是的,我确实尝试过@JsonProperty。问题是我只能更改 JSON 的名称。虽然我想改变结构。
  • @AbhayDandekar 你说的结构是什么意思?发布当前状态,您希望更改什么?

标签: spring-mvc spring-boot spring-data spring-data-jpa


【解决方案1】:

建议将 @Entity 类和 JSON 表示类分开。

假设您有@EntityEmployee。 一种选择是使用相同的Employee 类来描述您的数据库实体(例如使用JPA 注释),然后使用相同的Employee 类来描述您要返回给客户端的JSON(使用我们说Jackson 注释) .

由于各种原因,这被认为是不好的做法。 最常见的一种情况是,大多数时候您不希望所有实体都以 1:1 的比例映射到 JSON 响应。

为了解决这个问题,一种常见的方法是创建一个单独的Employee 类来描述您的 JSON 表示。你可以叫它EmployeeDto

然后你必须编写一个自定义逻辑,将@Entity Employee 映射到EmployeeDto

你可以像这样使用静态工厂方法:

//Persistence layer class
@Entity
public class Employee {
  @Id
  @GeneratedValue
  @Column(name = "id")
  private Long id;

  @Column(name = "first_name")
  private String firstName;

  @Column(name = "last_name")
  private String lastName;

  //getters/setters
}

//REST layer class
public class EmployeeDto {
  @JsonProperty("first_name")
  private String firstName;
  @JsonProperty("last_name")
  private String lastName;

  public EmployeeDto() {}

  // you can do any transforamtion/validation here
  public static EmployeeDto fromEntity(Employee employee){
    EmployeeDto dto = new EmployeeDto();
    dto.setFirstName(employee.getFirstName);
    dto.setLastName(employee.getLastName);
  }

  //getters/setters
}

然后您的控制器将返回 List<EmployeeDto> 而不是 @Entity Employee

更新:

Spring 不提供 DTO 和 Entity 对象之间的自动转换机制。我认为这取决于类的复杂性和对(DTO/Entity)的数量,但大多数时候自己实现转换很容易。

当然有一些库,它们提供了某种程度的映射自动化:

【讨论】:

  • 感谢您的回答。我期待一些可以将我的 DTO 类和我的实体类联系起来的 Spring 实体。那可能吗?带有一些注释或其他东西。否则,我们总是不得不用我们自己的逻辑来编写代码。
  • 在这个答案中有一个非常糟糕的主意,那就是适配器代码是最容易出错的代码。我见过太多次人们将 first_name 字段放入 lastName 属性,将 lastNameProperty 放入 middle_initial 字段。我并不是说 DTO 不好,我是说这个适配器代码是一个非常糟糕的做法。如果你打算使用 DTO,在许多用例中你应该使用它,然后使用一些 ModelMapping 工具,比如我在这篇文章中找到的 baeldung.com/…
  • Bugginess 是编码器的属性,而不是代码本身。如果有人不够专注于手动进行适当的字段映射......顺便说一句,答案已经包含对“自动”完成工作的两个映射框架的引用,但它是为关心阅读它的人准备的。如果映射逻辑在类内部(引入耦合)或外部(例如您自己编写的映射器类或使用框架),则存在差异,但无论哪种方式,最好不要将实体用作传统分层架构中较高层的 DTO 类模型。
猜你喜欢
  • 2021-07-14
  • 2021-07-03
  • 2017-08-23
  • 2017-06-16
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
相关资源
最近更新 更多