我正在构建基于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抛出异常,我唯一能想到的就是这样做。
答案 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<>();
}