2010-12-16 15 views
5

मेरे पास निम्न आदेश वस्तु:वसंत MVC बाध्यकारी

public class User { 
    private Department department; 
    private String firstName; 
    private String lastName; 
    private String login; 
    private String password; 
... 
} 

जो jsp पेज पर रेंडर किया जाना चाहिए:

<form:input path="lastName" /> 
<form:input path="department.name"/> 
<form:input path="department.description"/> 

तो जब मैं खाली department.name साथ प्रस्तुत और स्प्रिंग department.description खाली संपत्तियों के साथ स्वत: तत्काल वस्तु विभाग। (https://jira.springframework.org/browse/SPR-6032 देखें मैं autoGrowNestedPaths = true रखूंगा)

उपयोगकर्ता ऑब्जेक्ट को वापस पाने के लिए क्या करने की आवश्यकता है जहां विभाग ऑब्जेक्ट = शून्य?

+0

मुझे यकीन नहीं है कि यह चाल चलती है लेकिन आप "department.name" और "department.description" दोनों के लिए एक कस्टम संपादक पंजीकृत कर सकते हैं। SetAsText() विधि में इस कस्टम संपादक में स्ट्रिंग खाली नहीं होने पर केवल मान निर्धारित करें। इसलिए यदि आपके पास इस तत्व पर अधिक गुण नहीं हैं तो संपादक ऑब्जेक्ट पर सेटटर को कॉल करने से रोकेंगे (मुझे क्या यकीन नहीं है कि ऑब्जेक्ट को तत्काल नहीं किया जाएगा, भले ही कोई संपत्ति उस पर आबादी न हो, मुझे लगता है कि नहीं, लेकिन मैं पूरी तरह से यकीन नहीं कर रहा हूँ)। समस्या यह होगी कि यदि केवल एक संपत्ति खाली है तो खाली विशेषता शून्य के रूप में आबादी होगी। – Javi

+0

दुर्भाग्य से यह काम नहीं करता है। मैं इस तरह के संपादक को पंजीकृत करता हूं: dataBinder.registerCustomEditor (Department.class, नया विभाग संपादक()); और जिस तरह से उपयोगकर्ता ऑब्जेक्ट तत्काल विभाग के साथ खाली एट्रिब्यूट – eugenn

+0

के साथ आता है, क्या आपने नाम और विवरण के लिए सेटर्स पर ब्रेकपॉइंट सेट किए हैं (केवल यह देखने के लिए कि संपादक अच्छी तरह से पंजीकृत है और उन्हें लागू नहीं किया गया है)। जाने का एक और तरीका जावास्क्रिप्ट के साथ फॉर्म को क्रमबद्ध करने से पहले इन इनपुट को अक्षम करने के लिए सेट कर सकता है, क्योंकि फॉर्म भेजते समय अक्षम इनपुट नहीं भेजे जाएंगे। – Javi

उत्तर

5

वापस उपयोगकर्ता वस्तु जहां विभाग वस्तु = अशक्त प्राप्त करने के लिए क्या करने की जरूरत क्या है?

यदि आप नियंत्रक विशिष्ट समाधान की तलाश में हैं, तो सभी खाली घोंसले वाले पैराम ढूंढें और इन पैरा को अस्वीकृत फ़ील्ड के रूप में सेट करें।

@InitBinder(value="user") 
    public void bind(WebDataBinder dataBinder, WebRequest webRequest) { 
     List<String> emptyParams = new ArrayList<String>(); 
     Iterator<String> itr = webRequest.getParameterNames(); 
     while(itr.hasNext()) { 
      String name = itr.next(); 
      if(name.startsWith("department.")) { 
       Object value = webRequest.getParameter(name); 
       if("".equals(value)) { 
        emptyParams.add(name); 
       } 
      } 
     } 
     if(!emptyParams.isEmpty()) { 
      dataBinder.setDisallowedFields(emptyParams.toArray(new String[emptyParams.size()])); 
     } 
    } 

यदि आप एक सामान्य समाधान की तलाश में हैं तो कस्टम डेटा बाइंडर बनाएं और खाली सभी घोंसला वाले पैरा को हटा दें।

public class CustomDataBinder extends ServletRequestDataBinder { 

    @Override 
    protected void doBind(MutablePropertyValues mpvs) { 
     PropertyValue[] pvArray = mpvs.getPropertyValues(); 
     for (PropertyValue pv : pvArray) { 
      boolean nestedProperty = PropertyAccessorUtils.isNestedOrIndexedProperty(pv.getName()); 
      if(nestedProperty && "".equals(pv.getValue())) { 
       mpvs.removePropertyValue(pv); 
      } 
     } 
     super.doBind(mpvs); 
    } 

} 

और कस्टमडेटाइंडर का उपयोग करने के लिए आपके पास कस्टम हैंडलर एडाप्टर होना चाहिए।

public class StandardAnnotationMethodHandlerAdapter extends AnnotationMethodHandlerAdapter { 
    @Override 
    protected ServletRequestDataBinder createBinder(HttpServletRequest request, Object target, String objectName) throws Exception { 
    CustomDataBinder dataBinder = new CustomDataBinder (target, objectName); 
    return dataBinder; 
    } 
} 
संबंधित मुद्दे