के रूप में मैं एक डोमेन वस्तु वर्ग है User
(यह एक जेपीए इकाई है):स्प्रिंग नियंत्रक: उपयोग डोमेन वस्तुओं @RequestBody
@Entity
public class User {
private String name;
private boolean enabled = true;
// getters/setters
}
और मैं एक REST API पेशकश करने के लिए ग्राहकों को नए उपयोगकर्ताओं को बनाने के लिए अनुमति देने के लिए कोशिश कर रहा हूँ का उपयोग करते हुए स्प्रिंग 3 MVC:
@Controller
public class UserController {
@RequestMapping(value="/user", method=RequestMethod.POST)
@ResponseBody
public String createRealm(@RequestBody User user) {
user.setEnabled(true); // client is not allowed to modify this field
userService.createUser(user);
...
}
}
यह बहुत अच्छा काम करता है, लेकिन अगर यह लिए एक अच्छा विचार है @RequestBody के रूप में डोमेन ऑब्जेक्ट का उपयोग मैं नहीं जानता, क्योंकि मैं कुछ क्षेत्रों है कि नहीं होना चाहिए की रक्षा के लिए है सीधे ग्राहक द्वारा संशोधित (अर्थात। इस मामले में "सक्षम")।
क्या पेशेवरों/इन विकल्पों के विपक्ष हैं:
- उपयोग डोमेन वस्तुओं और (खेतों उपयोगकर्ता को संशोधित करने के लिए अनुमति नहीं है की रक्षा उदाहरण उन्हें सेट के लिए शून्य या द्वारा उसके डिफ़ॉल्ट मान को हाथ)
- उपयोग auxiliar का एक नया सेट करने के लिए इस तरह के एक UserRequest कि केवल खेतों मैं बाकी एपीआई के माध्यम से बेनकाब करना चाहते हैं के रूप में वस्तुओं (कुछ एक डीटीओ), के समान है, और उन्हें नक्शा (यानी Dozer के साथ) डोमेन ऑब्जेक्ट्स
दूसरा विकल्प इस प्रकार है:
@Entity
public class User {
private String name;
private boolean enabled = true;
// getters/setters
}
public class UserRequest {
private String name;
// enabled is removed
// getters/setters
}
@Controller
public class UserController {
@RequestMapping(value="/user", method=RequestMethod.POST)
@ResponseBody
public String createRealm(@RequestBody UserRequest userRequest) {
User user = ... // map UserRequest -> User
userService.createUser(user);
...
}
}
क्या कोई अन्य तरीका है कि कोड दोहराव से बचा जाता है और बनाए रखने के लिए आसान है?
ग्रेट उत्तर बोझो, धन्यवाद। उन क्षेत्रों को एनोटेट करने के लिए अस्वीकृत एनोटेशन बनाने के बारे में आप क्या सोचते हैं जिन्हें आप बेनकाब नहीं करना चाहते हैं (मुझे लगता है कि वसंत ऐसा कुछ भी नहीं पेश करता है), और binder.setDisallowedFields (MyUtils.findDisallowedFields (User.class)) पर कॉल करें? एक अनुमोदित एनोटेशन भी सुरक्षित हो सकता है। –
हाँ, उचित लगता है। – Bozho
क्षमा करें मैं आपको परेशान कर रहा हूँ। क्या आपको लगता है कि यह किसी प्रकार के एओपी पॉइंटकट का उपयोग करने के लिए एक अच्छी जगह है? –