5

की बाल इकाइयों को पुट/पैच अपडेट को कैसे रोकें मैं एक स्प्रिंग डेटा आरईएसटी/स्प्रिंग हैटोज़ आधारित एप्लिकेशन का निर्माण कर रहा हूं और मैं यहां उल्लिखित डीडीडी के सिद्धांतों का पालन करने का प्रयास कर रहा हूं (और कहीं और) :स्प्रिंग डेटा रेस्ट - कुल रूट

BRIDGING THE WORLDS OF DDD & REST - Oliver Gierke

विशेष रूप से समुच्चय और समर्पित संसाधनों के माध्यम से जटिल स्थिति परिवर्तन की अवधारणा।

अपने व्यापार डोमेन के (जटिल) राज्य संक्रमणों के लिए HTTP पैच या 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> 
{ 
} 

क्या सबसे अच्छा/सही एक कॉस्मेटिक परिवर्तन (जैसे अद्यतन टिप्पणी), लेकिन अनुमति देते हैं लेकिन परिवर्तन है कि सीधे बच्चे संग्रह अद्यतन को रोकने के लिए तरीका है:

इस सरल उदाहरण का उपयोग करते हुए?

एकमात्र चीज जो मैं सोच सकता हूं कि अगर बच्चे के संग्रह को संशोधित करने का प्रयास किया गया है तो सेटर को अपवाद फेंकना चाहिए।

+1

बधाई हो, आप बस एसडीआर में मीटर-गहरे खंभे में से एक को मारा। – chrylis

+2

आप मैपिंग पल पर अनुरोध से डेटा पढ़ने को रोक सकते हैं। यदि आप जैक्सन का उपयोग कर रहे हैं - अपने बच्चे के संग्रह को '@JsonProperty (access = JsonProperty.Access.READ_ONLY)' के साथ चिह्नित करें। तो इस क्षेत्र को केवल सेवा करने की अनुमति होगी, लेकिन अपडेट नहीं किया जाएगा। –

+0

@BogdanOros धन्यवाद यह बहुत अच्छा काम करता है, अगर आप इसे उत्तर के रूप में रखते हैं तो मैं इसे स्वीकार करूंगा। –

उत्तर

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

फिर से धन्यवाद @ बोगदान ओरोस। यह अच्छा होगा अगर कम से कम वसंत डेटा के बाकी उदाहरणों में यह शामिल है। यह कुल पैटर्न के आवेदन में एक बड़ा विचार प्रतीत होता है। –

संबंधित मुद्दे