簡體   English   中英

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原則:

彌合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拋出異常,我唯一能想到的就是這樣做。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM