2009-02-05 9 views
6

के लिए बाध्य मान लीजिए कि मैं निम्न आदेश वस्तु करते हैं:स्प्रिंग - एक वस्तु के बजाय एक स्ट्रिंग या आदिम

class BreakfastSelectCommand{ 
    List<Breakfast> possibleBreakfasts; 
    Breakfast selectedBreakfast; 
} 

मैं कैसे सूची से एक नाश्ते के साथ वसंत रूप से भरें "selectedBreakfast" हो सकता है?

मैं लगाना था मैं अपने jsp में कुछ इस तरह करते हैं:

<form:radiobuttons items="${possibleBreakfasts}" path="selectedBreakfast" /> 

लेकिन यह काम करने के लिए प्रतीत नहीं होता। कोई विचार?

धन्यवाद,

-Morgan

उत्तर

8

यह इस सब के लिए महत्वपूर्ण PropertyEditor है।

आपको अपने ब्रेकफास्ट क्लास के लिए प्रॉपर्टी एडिटर को परिभाषित करने की आवश्यकता है और उसके बाद रजिस्टर नियंत्रक का उपयोग करके ServletDataBinder को अपने नियंत्रक की initBinder विधि में कॉन्फ़िगर करें।

उदाहरण:

public class BreakfastPropertyEditor extends PropertyEditorSupport{ 
    public void setAsText(String incomming){ 
     Breakfast b = yourDao.findById(Integer.parseInt(incomming)); 
     setValue(b); 
    } 
    public String getAsText(){ 
     return ((Breakfast)getValue()).getId(); 
    } 
} 

टिप्पणी आप कुछ अशक्त आदि की जाँच की आवश्यकता होगी, हो जाएगा, लेकिन आप विचार मिलता है। अपने नियंत्रक में:

public BreakfastFooBarController extends SimpleFormController { 
    @Override 
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { 
     binder.registerCustomEditor(Breakfast.class, new BreakfastPropertyEditor(yourDao)); 
    } 
} 

बातों के लिए बाहर देखने के लिए:

  • PropertyEditor के सूत्र नहीं कर रहे हैं सुरक्षित
  • यदि आप वसंत सेम की जरूरत है, या तो स्वयं उन्हें इंजेक्षन या प्रोटोटाइप गुंजाइश के रूप में वसंत में उन्हें परिभाषित करने और अपने नियंत्रक में विधि इंजेक्शन का उपयोग करें
  • अवैध त्रुटि को फेंक दें अगर इनबाउंड पैरामीटर मान्य नहीं है/नहीं मिला, वसंत इसे बाध्यकारी त्रुटि में सही ढंग से परिवर्तित करेगा

उम्मीद है कि इससे मदद मिलती है।

संपादित करें (टिप्पणी के जवाब में): यह दिए गए उदाहरण में थोड़ा अजीब लग रहा है क्योंकि BreakfastSelectCommand एक इकाई की तरह नहीं दिखता है, मुझे यकीन नहीं है कि आपके पास वास्तविक परिदृश्य क्या है। मान लें कि यह एक इकाई है, उदाहरण के लिए Personbreakfast संपत्ति के साथ formBackingObject() विधि व्यक्ति वस्तु को PersonDao से लोड करेगी और इसे कमांड के रूप में वापस कर देगी। बाध्यकारी चरण तब चयनित मूल्य के आधार पर नाश्ते की संपत्ति को बदल देगा, जैसे कि onSubmit में आने वाले आदेश में सभी नाश्ते की संपत्ति है।

आपके डीएओ ऑब्जेक्ट्स के कार्यान्वयन के आधार पर उन्हें दो बार बुलाकर या एक ही इकाई को दो बार लोड करने का प्रयास करने का मतलब वास्तव में यह नहीं है कि आपको दो SQL कथन चलेंगे। यह विशेष रूप से हाइबरनेट पर लागू होता है, जहां यह गारंटी देता है कि यह उसी ऑब्जेक्ट को वापस देगा जो किसी दिए गए पहचानकर्ता के लिए सत्र में है, इस प्रकार बाध्यकारी प्रयास को Breakfast चयन को लोड करने के लिए भी चल रहा है, इसके परिणामस्वरूप कोई भी परिणाम नहीं बदला जाना चाहिए अनावश्यक ओवरहेड।

+0

धन्यवाद gid। बाध्यकारी के बिंदु पर, क्या मेरी कमांड ऑब्जेक्ट पहले से ही नहीं बनाई जाएगी (दूसरी बार)? यह अजीब लगता है कि मुझे आपके दाओ का एक और अनुरोध करने की आवश्यकता है। – morgancodes

+0

@ मॉर्गनकोड ऊपर संपादित देखें ...थोड़ी अधिक जगह –

+2

की आवश्यकता है जो कि एक ही अपवोट नहीं है ... –

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