हम वसंत 3.2 में एक विशेष आंशिक अद्यतन फ़ंक्शन को लागू करने का प्रयास कर रहे हैं। हम बैकएंड के लिए वसंत का उपयोग कर रहे हैं और एक साधारण जावास्क्रिप्ट फ्रंटेंड है। मैं हमारी आवश्यकताओं के लिए सीधा-आगे समाधान खोजने में सक्षम नहीं हूं, जो है() फ़ंक्शन किसी भी फ़ील्ड में लेना चाहिए: मूल्यों के अनुसार दृढ़ता मॉडल को मानें और अपडेट करें।वसंत आंशिक अद्यतन ऑब्जेक्ट डेटा बाध्यकारी
हमारे पास हमारे सभी क्षेत्रों के लिए ऑनलाइन संपादन है, ताकि जब उपयोगकर्ता एक फ़ील्ड संपादित करता है और पुष्टि करता है, तो एक आईडी और संशोधित फ़ील्ड नियंत्रक को जेसन के रूप में पास कर दिया जाता है। नियंत्रक क्लाइंट से किसी भी फ़ील्ड (1 से n) में लेने और केवल उन फ़ील्ड को अपडेट करने में सक्षम होना चाहिए।
जैसे, आईडी == 1 के साथ एक उपयोगकर्ता अपने DISPLAYNAME संपादित करता है तो डेटा सर्वर पर पोस्ट इस तरह दिखता है:
{"id":"1", "displayName":"jim"}
वर्तमान में, हम UserController में एक अधूरी समाधान के रूप में नीचे उल्लिखित:
@RequestMapping(value = "/{id}", method = RequestMethod.POST)
public @ResponseBody ResponseEntity<User> update(@RequestBody User updateUser) {
dbUser = userRepository.findOne(updateUser.getId());
customObjectMerger(updateUser, dbUser);
userRepository.saveAndFlush(updateUuser);
...
}
कोड यहाँ काम करता है, लेकिन कुछ मुद्दे हैं: @RequestBody
एक नया updateUser
बनाता है, id
और displayName
में भरता है। CustomObjectMerger
डेटाबेस से संबंधित के साथ updateUser
विलय करता है, जो updateUser
में शामिल फ़ील्ड को अपडेट करता है।
समस्या यह है कि वसंत मूलभूत मूल्यों और अन्य स्वतः निर्मित फ़ील्ड मान है, जो, विलय की बात है, मान्य डेटा हम dbUser
में है कि अधिलेखित कर देता है साथ updateUser
में कुछ फ़ील्ड का निर्माण है। स्पष्ट रूप से यह घोषणा करते हुए कि इन क्षेत्रों को अनदेखा करना एक विकल्प नहीं है, क्योंकि हम इन क्षेत्रों को सेट करने में सक्षम होने के लिए हमारे update
चाहते हैं।
मैं किसी तरह से में देख रहा हूँ वसंत स्वचालित रूप से (डिफ़ॉल्ट/ऑटो फ़ील्ड मान को रीसेट किए बिना) केवल जानकारी स्पष्ट रूप से dbUser
में update()
समारोह में भेजा विलय है। क्या ऐसा करने का कोई आसान तरीका है?
अद्यतन: मैंने पहले से ही निम्न विकल्प माना है जो मैं पूछ रहा हूं, लेकिन काफी नहीं। समस्या यह है कि यह @RequestParam
के रूप में अद्यतन डेटा लेता है और (AFAIK) JSON तार नहीं करता है कि:
//load the existing user into the model for injecting into the update function
@ModelAttribute("user")
public User addUser(@RequestParam(required=false) Long id){
if (id != null) return userRepository.findOne(id);
return null;
}
....
//method declaration for using @MethodAttribute to pre-populate the template object
@RequestMapping(value = "/{id}", method = RequestMethod.POST)
public @ResponseBody ResponseEntity<User> update(@ModelAttribute("user") User updateUser){
....
}
मैं माना जाता है फिर से लिख मेरी customObjectMerger()
JSON के साथ और अधिक उचित रूप से काम करने के लिए, गिनती और इसे लेने के होने विचार में केवल HttpServletRequest
से आने वाले फ़ील्ड। लेकिन पहली जगह में customObjectMerger()
का उपयोग करने के लिए भी हैकी लगता है जब वसंत लगभग बिल्कुल ठीक है जो मैं देख रहा हूं, कमजोर JSON कार्यक्षमता से कम है। यदि कोई जानता है कि स्प्रिंग को ऐसा करने के लिए कैसे जाना है, तो मैं इसकी सराहना करता हूं!
@ सैमसेला - क्या आपको कभी भी बेहतर समाधान मिल गया है, विशेष रूप से ऐसी स्थिति के लिए जहां घोंसला वाली वस्तुएं हैं? मेरे पास एक ही समस्या है, और इस पोस्ट को पढ़ने से पहले, आपके जैसा कुछ किया .. यदि आपके पास समय है तो कृपया देखें: http://stackoverflow.com/questions/16473727/spring-3-ajax-post-request-with -requestbody-and-modelattribute-and-sessionatt – arcseldon