我的数据库中有几张桌子。员工,地址,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提供响应。
所以我的问题是:
有没有Spring方式来解决我的要求。这样我就可以将我的实体类映射到某个JSON类。
是否有可以在这种情况下使用的设计模式。
非常感谢!
答案 0 :(得分:2)
建议将@Entity
类和JSON表示类分开。
我们假设你有@Entity
班Employee
。
一种选择是使用相同的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),但大多数时候它很容易自己实现转换。
当然有一些库,它们提供了一定程度的自动化与映射: