2011-10-04 14 views
5

क्या किसी फ़ॉर्म पर सेट से ठीक से बाध्य करने का कोई तरीका है?सूची के लिए सेट फ्रेमवर्क फॉर्म बाध्यकारी

मैं POJO बंधन और मेरी नियंत्रक

public static void create(User user) 

user.java

public class User implements Serializable { 



    public Long id; 

    @Required 
    @Email 
    public String email; 

    public Set<Group> groups; 

} 

Group.java

एक उपयोगकर्ता वस्तु में ले जाता है
public class Group implements Serializable { 

     public Long id; 

     public String name; 

    } 

मैं नहीं कर पा रहे कर रहा हूँ समूह को बांधने के लिए मेरा क्षेत्र प्राप्त करने के लिए

मैंने user.groups []। Id, user.groups [0] .id, user.groups.id को आजमाया है। मैं इसे एक सूची के साथ काम करने के लिए ठीक कर सकता हूं लेकिन जब यह पोस्ट करता है तो मुझे एन तत्वों की एक सूची मिलती है जिसमें शून्य आइटमों का एक समूह होता है (प्रत्येक चेकबॉक्स के लिए एक नल जिसे चेक नहीं किया गया था) और मैं नल के बिना एक नई सूची बना सकता था लेकिन यह गलत लगता है।

संपादित करें: उपयोगकर्ता और समूह लगातार संस्थाओं होने के लिए नहीं होती हैं, प्ले महज एक शोकहारा एपीआई

उत्तर

3

Play 1.2.4 का नया बांधने वाला कार्यान्वयन यह अनुमति देता है।

प्ले संस्करणों में पहले करने के लिए 1.2.4 (दिसंबर 02, 2011 को जारी) यदि आप एक एक सूची के लिए बाध्य के साथ की तरह

user.groups[1].id = 1 
user.groups[1].name = "name1" 
user.groups[3].id = 3 
user.groups[3].name = "name3" 
user.groups[4].id = 4 
user.groups[4].name = "name4" 

समस्या मापदंडों भेजकर सेट बाध्य नहीं कर सकता है कि आप एक सूची मिल जाएगा है लंबाई 5 की लंबाई जहां 0 और 2 का मान शून्य है।

आप अभी भी प्ले संस्करण 1.2.4 से नाबालिग का उपयोग करने की जरूरत है, इस समस्या के लिए एक समाधान

Map<String, Group> groups 
सेट या सूची के बजाय

का उपयोग किया जा सकता है। तब आपको बीच में शून्य तत्व नहीं मिलेंगे और आप समूहों को कॉल करके संग्रह प्राप्त करेंगे .values ​​()।

+0

धन्यवाद जब मैं इसे सत्यापित कर सकता हूं तो मैं स्वीकार करूंगा :) – dstarh

+0

वर्ग ब्रैकेट में मान सूची अनुक्रमणिका हैं और शून्य से लगातार होना चाहिए और यदि वे प्ले नहीं हैं तो शून्य मानों में जोड़ता है। – tazmaniax

0

प्रथम के लिए एक राज्यविहीन और लगातार कम प्रस्तुति परत के रूप में काम कर रहा है, User और Group के बाद से इकाई हो रहा है , आपको play.db.jpa.Model कक्षा का विस्तार करना चाहिए और इसे @Entity के रूप में परिभाषित करना चाहिए। उदाहरण के लिए:

@Entity 
public class User extends Model { 

    ... 

} 

Model के विस्तार के लिए धन्यवाद, आप (यानी आप public Long id निकाल सकते हैं) तकनीकी आईडी परिभाषित करने की जरूरत नहीं है, और आप इस वर्ग के लिए एक सामान्य डीएओ होगा (Javadoc देखें)

अब, आप उस तरह User के समूह निर्धारित करने के लिए है:

@ManyToMany 
public Set<Group> groups; 
+0

ठीक कुछ चीजें, उपयोगकर्ता और समूह इकाइयां नहीं हैं, नाटक केवल एक स्थिर एपीआई के लिए एक स्टेटलेस और लगातार कम प्रस्तुति परत के रूप में कार्य कर रहा है। असली मुद्दा यहां और शायद मैंने इस बात पर प्रकाश डाला नहीं कि पर्याप्त रूप से एक एसईटी से जुड़ा नहीं जा सकता है, लेकिन यह एक सूची – dstarh

0

मैं खेलने के साथ समान मुद्दा है। प्ले बाइंडिंग ऑटो-जादू है, लेकिन कभी-कभी आपको कामकाज करने की ज़रूरत होती है।

आप बस एक सेटर

public void setGroups(List<Group> groups) 

बना सकते हैं और आंतरिक रूप से अपने सेट करने के लिए प्रदान समूहों की स्थापना की। यह थोड़ा गंदा है लेकिन काम करेगा।

मैं आपको बाइंडिंग अनुकरण करने के लिए यूनिट टेस्ट केस बनाने की भी सलाह देता हूं। पोस्ट अनुरोध अनुकरण करने के लिए मानचित्र बनाएं और मानचित्र को अपनी ऑब्जेक्ट को बाइंडर पर बाध्य करें। यह वेब-इंटरफ़ेस से प्रक्रिया को दोहराने से कहीं अधिक आसान है, और यह एक रिग्रेशन टेस्ट बनाता है और आपको चेतावनी देता है कि प्ले के अपडेट कुछ बाध्यकारी व्यवहार तोड़ते हैं (यह मेरे साथ होता है)।

+0

पर हो सकता है हाँ यह काम करेगा लेकिन यह अभी भी इस तथ्य को नहीं बदलेगा कि आपको अपने फ़ील्ड obj नाम देने की आवश्यकता है .collection [index] .prop – dstarh

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