代码之家  ›  专栏  ›  技术社区  ›  Adam Jones

Spring Data Rest-如何防止对聚合根的子实体进行PUT/PATCH更新

  •  5
  • Adam Jones  · 技术社区  · 8 年前

    我正在构建一个基于Spring数据REST/Spring HATEOAS的应用程序,并尝试遵循此处(和其他地方)概述的DDD原则:

    BRIDGING THE WORLDS OF DDD & REST - Oliver Gierke

    特别是聚合和复杂状态的概念通过专用资源发生变化。

    此外,还应避免使用HTTP补丁或PUT进行业务域的(复杂)状态转换,因为您遗漏了许多有关触发此更新的真实业务域事件的信息。例如,更改客户的邮寄地址是向新的“ChangeOfAddress”资源发送的邮件,而不是对具有不同邮寄地址字段值的客户资源进行修补或放置。

    我正在努力解决的是一种在允许对聚合根进行外观更改的同时强制执行此操作的方法。

    使用此简化示例:

    @Entity
    public class Customer
    {
       private @Id @GeneratedValue(strategy = GenerationType.AUTO) Long id;
    
       private String name;
    
       private String comment;
    
       @Access(AccessType.PROPERTY)
       @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
       private Set<Address> addresses = new HashSet<>();
    
       ... getters and setters
    
        public void addAddress(Address address)
        {
            addresses.add(address);
            ... custom code to raise events etc
        }
    }
    
    public interface Customer extends CrudRepository<Customer, Long>
    {
    }
    

    允许外观更改(例如更新注释)但阻止直接更新子集合的更改的最佳/正确方法是什么?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Bogdan Oros    8 年前
    @Entity
    public class Customer
    {
       private @Id @GeneratedValue(strategy = GenerationType.AUTO) Long id;
    
       private String name;
    
       private String comment;
    
       @JsonProperty(access = JsonProperty.Access.READ_ONLY)
       @Access(AccessType.PROPERTY)
       @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
       private Set<Address> addresses = new HashSet<>();
    }