5

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.

+1

Xin chúc mừng, bạn vừa nhấn một trong những ổ gà sâu mét trong SDR. – chrylis

+2

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. –

+0

@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ó. –

Trả lời

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

Cảm ơn một lần nữa @Bogdan Oros. Nó sẽ được tốt đẹp nếu ít nhất một trong những ví dụ về phần còn lại dữ liệu mùa xuân được bảo hiểm này. Nó dường như là một cân nhắc chính trong việc áp dụng các mô hình tổng hợp. –

Các vấn đề liên quan