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

Spring Data Rest - How to prevent PUT/PATCH updates to child entities of aggregate root

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

BRIDGING THE WORLDS OF DDD & REST - Oliver Gierke

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

Also avoid using HTTP PATCH or PUT for (complex) state transitions of your business domain because you are missing out on a lot of information regarding the real business domain event that triggered this update. For example, changing a customer’s mailing address is a POST to a new "ChangeOfAddress" resource, not a PATCH or PUT of a “Customer” resource with a different mailing address field value.

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

使用这个简化的例子:

@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>
{
}

best/correct允许外观更改(例如更新评论)但阻止直接更新子集合的更改的方法是什么?

我唯一能想到的事情就是让 setter 在尝试修改子集合时抛出异常。

@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<>();
}