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

时间:2017-11-20 18:29:52

标签: java spring domain-driven-design spring-data-rest spring-hateoas

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

BRIDGING THE WORLDS OF DDD & REST - Oliver Gierke

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

  

还要避免将HTTP PATCH或PUT用于业务域的(复杂)状态转换,因为您错过了有关触发此更新的实际业务域事件的大量信息。例如,更改客户的邮件地址是对新“ChangeOfAddress”资源的POST,而不是具有不同邮件地址字段值的“Customer”资源的PATCH或PUT。

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

使用这个简化的例子:

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

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

如果尝试修改子集合,如果让setter抛出异常,我唯一能想到的就是这样做。

1 个答案:

答案 0 :(得分:1)

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