2011-08-12 8 views
5

के रूप में मैं एक डोमेन वस्तु वर्ग है 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 के रूप में डोमेन ऑब्जेक्ट का उपयोग मैं नहीं जानता, क्योंकि मैं कुछ क्षेत्रों है कि नहीं होना चाहिए की रक्षा के लिए है सीधे ग्राहक द्वारा संशोधित (अर्थात। इस मामले में "सक्षम")।

क्या पेशेवरों/इन विकल्पों के विपक्ष हैं:

  1. उपयोग डोमेन वस्तुओं और (खेतों उपयोगकर्ता को संशोधित करने के लिए अनुमति नहीं है की रक्षा उदाहरण उन्हें सेट के लिए शून्य या द्वारा उसके डिफ़ॉल्ट मान को हाथ)
  2. उपयोग 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); 
      ... 
    } 
} 

क्या कोई अन्य तरीका है कि कोड दोहराव से बचा जाता है और बनाए रखने के लिए आसान है?

उत्तर

5

एक और विकल्प नहीं है - आप गुणों का एक सेट जमा करने अस्वीकार कर सकते हैं, का उपयोग करते हुए (.setAllowedFields(..) या का उपयोग करते हुए) DataBinder.setDisallowedFields(..)

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.setDisallowedFields(..); 
} 

यदि आप एक या दो गुण हैं जो अलग है यह ठीक है।

अन्यथा, एक विशेष वस्तु (जैसे ProfileDetails या UserRequest) अधिक समझ में आता है। मैं एक अलग इकाई में सभी प्रोफ़ाइल से संबंधित क्षेत्र डाल करने के लिए है इस परिदृश्य के लिए इस तरह के एक डीटीओ जैसी वस्तु का उपयोग कर रहा है और फिर कॉमन्स-beanutils से BeanUtils.copyProperties(..) साथ क्षेत्रों हस्तांतरण

एक तीसरा, शायद बेहतर विकल्प है, (@OneToOne साथ मैप किया उपयोगकर्ता के साथ) या @Embeddable ऑब्जेक्ट पर, और इसके बजाय इसका उपयोग करें।

+0

ग्रेट उत्तर बोझो, धन्यवाद। उन क्षेत्रों को एनोटेट करने के लिए अस्वीकृत एनोटेशन बनाने के बारे में आप क्या सोचते हैं जिन्हें आप बेनकाब नहीं करना चाहते हैं (मुझे लगता है कि वसंत ऐसा कुछ भी नहीं पेश करता है), और binder.setDisallowedFields (MyUtils.findDisallowedFields (User.class)) पर कॉल करें? एक अनुमोदित एनोटेशन भी सुरक्षित हो सकता है। –

+0

हाँ, उचित लगता है। – Bozho

+0

क्षमा करें मैं आपको परेशान कर रहा हूँ। क्या आपको लगता है कि यह किसी प्रकार के एओपी पॉइंटकट का उपयोग करने के लिए एक अच्छी जगह है? –

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