2008-11-12 17 views
15

में एक संग्रह में संग्रह विशेषताओं को कैसे बांधूं, मैं स्प्रिंग-एमवीसी का उपयोग करके, मेरे मॉडल ऑब्जेक्ट्स में से किसी एक फॉर्म के फ़ील्ड में बाध्य करने की कोशिश कर रहा हूं। सबकुछ ठीक काम करता है, सिवाय इसके कि मॉडल ऑब्जेक्ट के गुणों में से एक एक अनियंत्रित संग्रह है।मैं स्प्रिंग एमवीसी

<c:forEach items="${m.items}" var="i" varStatus="itemsRow"> 
     <form:input path="items[${itemsRow.index}]"/> 
    </c:forEach> 
    <form:errors path="items" /> 

की तरह कुछ कर रही एक सूची प्रकार संपत्ति के लिए ठीक काम करेगा, लेकिन के लिए एक सेट एक त्रुटि फेंकता है जब, पर भेजते हैं तो यह गुण आपत्ति उठाने का इनपुट क्षेत्र सामग्री बाध्य करने के लिए कोशिश करता है।

क्या वसंत में कुछ ऐसा है जो सेट के साथ बॉक्स से बाहर काम करता है?

+0

मैं दुखी सवाल यह है कि पहली बार और उस तरह के पथ विशेषता का उपयोग करने से परिचित नहीं हूँ। – zmf

+0

हे!मुझे मत देखो, मैंने इसे केवल एक कोशिश की क्योंकि यह कुछ यादृच्छिक Google खोजों में निकला। मैं परीक्षण और त्रुटि से वसंत सीख रहा हूं ;-) – agnul

उत्तर

5

मुझे लगता है कि इसे एक आदेश दिया गया संग्रह होना है। उदाहरण के लिए, वसंत संदर्भ में a chart है जो गुणों का संदर्भ कैसे देता है इसके बारे में बात करता है। इसे कहते हैं:

खाते [2] अनुक्रमित संपत्ति खाते के तीसरे तत्व दर्शाता है। इंडेक्स गुण प्रकार सरणी, सूची या अन्य स्वाभाविक रूप से आदेश दिया संग्रह (उनकी जोर)

शायद एक दृष्टिकोण अपने ऑब्जेक्ट में एक गेटर जोड़ने के लिए हो सकता है कि, अपने सेट लौटने के बजाय, रिटर्न के हो सकते हैं Set.toArray()। फिर आपके आइटम विशेषता सरणी का संदर्भ लेंगी। बेशक, आप आदेश पर निर्भर नहीं कर सकते हैं।

+1

मैं मॉडल ऑब्जेक्ट के आस-पास एक सजावट का उपयोग कर सकता हूं ... एक अच्छा विचार दिखता है। – agnul

1

मैं क्रिस्टल स्पष्ट नहीं हूं कि यह वास्तव में कैसे बंधेगा, लेकिन यह मेरे उद्देश्यों के लिए काम करता है।

<c:forEach items="${items}" var="i" varStatus="itemsRow"> 
     <input name="items[${itemsRow.index}].fieldName" type="text"/> 
    </c:forEach> 
<form:errors path="items" /> 
+2

हास्यास्पद फ़ॉर्म से कैसे बचें:/पथ सामग्री त्रुटि से बचाती है। – bmargulies

+0

इस व्यवहार का कारण यहां समझाया गया है: http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/ – Alex

3

मुझे लगता है कि यह सेट के साथ काम नहीं करता है क्योंकि सेट के आदेश की गारंटी नहीं है। जब आप पोस्ट पर पहली ऑब्जेक्ट से जुड़ने का प्रयास करते हैं, तो हो सकता है कि वह उस सूची में पहली ऑब्जेक्ट प्रस्तुत न हो। उदाहरण के लिए, आइटम [0] जीईटी और पोस्ट के बीच समान नहीं हो सकता है।

तो यदि आप सॉर्ट किए गए सेट या कार्यान्वयन जैसे सॉर्ट किए गए सेट के कार्यान्वयन का उपयोग करते हैं तो इसे ठीक काम करना चाहिए।

+0

बस इसे आज़माएं। सॉर्टेडसेट एक इंटरफ़ेस है, इसलिए आप इसका उपयोग नहीं कर सकते हैं और ट्रीसेट समस्या को ठीक करने के लिए प्रकट नहीं होता है। –

+0

मुझे बस यही समस्या थी, इस सवाल को मिला, मेरे फॉर्म तत्व को ट्रीसेट बनने के लिए बदल दिया, और यह काम करता है! मुझे बहुत समय बचाने के लिए धन्यवाद! – nont

1

आप नौकरी करने के लिए अपना खुद का कस्टम संपादक लिखने का प्रयास कर सकते हैं, और फिर फॉर्म के लिए नियंत्रक के साथ संपादक को पंजीकृत कर सकते हैं। इस तरह सेट में तत्वों को अनुक्रमणित करने के साथ आपको परेशान नहीं होना पड़ेगा। और जैसा कि पहले उल्लेख किया गया है, यदि तत्वों को सॉर्ट करने का कोई तरीका है, तो आप सॉर्टेडसेट का उपयोग करके सेट में अपना ऑर्डर सुनिश्चित कर सकते हैं।

-1

यदि आप ऑब्जेक्ट्स की आईडी के संख्यात्मक संदर्भों का उपयोग कर रहे हैं, और पंजीकृत एक उचित कनवर्टर कार्यान्वयन का उपयोग कर रहे हैं तो आप अर्ध-कॉलन-सीमांकित सूची का उपयोग कर सकते हैं।

पोस्ट डेटा लीडरबोर्ड = 1,2

कनवर्टर कार्यान्वयन (JSON सामान की अनदेखी)

public final class LeaderboardConverter extends JsonDeserializer<Leaderboard> implements Converter<String, Leaderboard> 
    { 
     public Leaderboard convert(String source) throws IllegalArgumentException 
     { 
      Leaderboard activity = new Leaderboard(); 
      activity.setId(new Integer(source)); 
      return activity; 
     } 


     public Leaderboard deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException 
     { 
      return convert(jp.getText()); 
     } 

} 
2

यहाँ सही समाधान नहीं मिला: http://forum.springsource.org/showthread.php?45312-Submitting-arrays

सामान्य विचार - का उपयोग कर कॉमन्स-संग्रह तरीकों को init सूची:

private List someList = LazyList.decorate(new ArrayList(), FactoryUtils.instantiateFactory(com.abc.xyz.SomeClass.class));