Tôi đang xây dựng một ứng dụng dựa trên Spring REST/Spring HATEOAS và tôi đang cố gắng tuân theo các nguyên tắc của DDD được nêu ở đây (và ở nơi khác) :Nghỉ ngơi dữ liệu mùa xuân - Cách ngăn chặn cập nhật PUT/PATCH cho các thực thể con của tổng hợp gốc
BRIDGING THE WORLDS OF DDD & REST - Oliver Gierke
Đặc biệt các khái niệm về uẩn và thay đổi trạng thái phức tạp thông qua các nguồn lực dành riêng.
Cũng tránh sử dụng HTTP PATCH hoặc PUT cho chuyển tiếp trạng thái phức tạp của miền doanh nghiệp của bạn vì bạn đang bỏ lỡ rất nhiều thông tin liên quan đến sự kiện miền doanh nghiệp thực đã kích hoạt bản cập nhật này. Ví dụ: thay đổi địa chỉ gửi thư của khách hàng là POST thành tài nguyên "ChangeOfAddress" mới, không phải PATCH hoặc PUT của tài nguyên “Khách hàng” có giá trị trường địa chỉ nhận thư khác nhau.
Điều tôi đang gặp phải là phương tiện thực thi điều này trong khi cho phép thay đổi mỹ phẩm đối với gốc tổng hợp.
Sử dụng ví dụ đơn giản này:
@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>
{
}
/cách đúng nhất để cho phép một sự thay đổi mỹ phẩm (ví dụ cập nhật bình luận) nhưng nhưng ngăn ngừa những biến trực tiếp cập nhật các bộ sưu tập trẻ em là gì?
Điều duy nhất tôi có thể nghĩ là làm gì nếu người thiết lập ném một ngoại lệ nếu có nỗ lực sửa đổi bộ sưu tập con.
Xin chúc mừng, bạn vừa nhấn một trong những ổ gà sâu mét trong SDR. – chrylis
Bạn có thể ngăn chặn việc đọc dữ liệu từ yêu cầu tại thời điểm ánh xạ. Nếu bạn đang sử dụng Jackson - hãy đánh dấu các bộ sưu tập con của bạn bằng '@JsonProperty (access = JsonProperty.Access.READ_ONLY)'. Vì vậy, trường này sẽ chỉ được phép để được phục vụ, nhưng không được cập nhật. –
@BogdanOros Cảm ơn công trình này tuyệt vời, nếu bạn đặt nó như là một câu trả lời tôi sẽ chấp nhận nó. –