Skip to main content
 首页 » 编程设计

spring-mvc之将 Spring 实体对象转换为修改后的 JSON 对象

2025年05月04日25Terrylee

我的数据库中有几张表。员工、地址、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 类。
  • 有没有可以在这种情况下使用的设计模式。

  • 谢谢一堆!

    请您参考如下方法:

    建议留着你@Entity类和您的 JSON 表示类分开。

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

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

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

    然后你必须写一个自定义逻辑来映射 @Entity EmployeeEmployeeDto .

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

    //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 
    } 
    

    然后您的 Controller 将返回 List<EmployeeDto>而不是 @Entity Employee .

    更新:

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

    当然,那里有一些库,它们为映射提供了一定程度的自动化:
  • ModelMapper
  • Orica