将Spring Entity对象转换为已修改的JSON对象

时间:2018-02-15 13:12:52

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

我的数据库中有几张桌子。员工,地址,Phone_id

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. 是否有可以在这种情况下使用的设计模式。

  3. 非常感谢!

1 个答案:

答案 0 :(得分:2)

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

我们假设你有@EntityEmployee。 一种选择是使用相同的Employee类来描述您的数据库实体(使用let说#JAA注释),然后使用相同的Employee类来描述您想要返回的JSON。客户(使用let说杰克逊注释)。

由于各种原因,这被认为是不好的做法。 最常见的一点是,大多数情况下,您不希望所有实体都以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),但大多数时候它很容易自己实现转换。

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