2011-08-20 12 views
10

मैं requestScope में managedBean userHome, जिसमें इकाई 'उपयोगकर्ता जारी रहती होने जा रहा है उपयोग कर रहा हूँ के लिए मान्य नहीं है। उपयोगकर्ता के पास मौजूद नेता स्तंभ जो ManyToOne relation.My संहिता में मैप किया गया है की तरह लग रहा है इसJSF कनवर्टर प्रमाणीकरण त्रुटि: मूल्य SelectOneMenu UIComponent

@ManagedBean 
@RequestScoped 
public class UserHome { 
    private User user = new User(); 
     // Getters and Setters 

    private List<SelectItem> selectItems = new ArrayList<SelectItem>(); 

    public UserHome() { 
     for(User user: availableLeaders) { 
      selectItems.add(new SelectItem(user.getName(), user)); 
     } 
    } 

    public void persis(); 
} 

User.java

public class User { 
    @Id 
    @Column 
    private Integer id; 

    @Column 
    privat String name; 

    @ManyToOne 
    private User leader; 
} 

मैं h:selectOneMenu इस तरह के माध्यम से इस नेता का मूल्य प्राप्त करने के लिए कोशिश कर रहा हूँ

<h:selectOneMenu value="#{userHome.user.leader}" converter="userConverter"> 
    <f:selectItems value="#{userHome.selectItems}"/> 
</h:selectOneMenu> 

मेरे कनवर्टर इस

की तरह दिखता है

उपयोगकर्ता मैं त्रुटि UserEdit हो रही है को बचाने की कोशिश करते हुए: j_idt18: प्रमाणीकरण त्रुटि: मान

उत्तर

14

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

कोड प्रदर्शित नहीं करता है जहां availableLeaders से आता है, लेकिन अगर इस मांग पर एक डीबी से लाई गई है, तो कनवर्टर ठीक उसी वस्तु दृष्टान्त सूची JSF #{userHome.selectItems} के माध्यम से हल करता है कि में है कि करने के लिए कनवर्ट नहीं होंगे।

रूपांतरण के बाद, जेएसएफ जांच करेगा कि परिवर्तित सूची equals() विधि का उपयोग कर उस सूची में पाई जा सकती है या नहीं।

+0

हाय, यह मोजोजरा कोड में बिल्कुल कहां है, यह जांच के बराबर होता है।मैं एक कस्टम घटक लिख रहा हूं, और मैं इस मुद्दे में भाग गया, और मैं यह देखने के लिए मोजोजरा कोड डीबग करना चाहता हूं कि क्या हो रहा है। धन्यवाद –

+0

यह 'UISelectMany # validateValue' में होता है, वास्तविक चयन के साथ' selectUtils # matchValue' में 'बराबर' होने के लिए। –

+0

यूप, बहुत सारे डीबग के बाद, मैं इसे समझने में सक्षम हूं, क्या यह मान्य करने के लिए एक बुरा अभ्यास मानता है? मेरा कस्टम घटक UISelectOne से फैला हुआ है, और यह विधि मान्य है वैल्यू मुझे इतनी दुखी करती है, अगर मैं खाली सामग्री के साथ इस विधि को ओवरड करता हूं, तो चीजें सही तरीके से काम करती हैं। लेकिन मुझे एहसास है कि यह ऐसा कुछ है जो मुझे नहीं करना चाहिए। कोई सोच? –

8

आप SelectItem गलत तरीके से निर्माण किया गया है मान्य नहीं है। class' documentation के अनुसार, पहला तर्क आइटम मान (जिसे परिवर्तित और सबमिट किया जाना है) का प्रतिनिधित्व करना चाहिए और दूसरा तर्क आइटम लेबल (जिसे सूची में प्रदर्शित किया जाना है) का प्रतिनिधित्व करना चाहिए। लेकिन आपने उन्हें दूसरे तरीके से निर्दिष्ट किया।

इसे ठीक करें तदनुसार:

selectItems.add(new SelectItem(user, user.getName())); 

है कि अभी भी समस्या हल नहीं होती है, तो इसका मतलब है कि User वर्ग के equals() विधि (ठीक से) लागू नहीं है। जेएसएफ रूपांतरण के बाद सूची के किसी आइटम मूल्य के विरुद्ध चयनित User को सत्यापित करने के लिए इसका उपयोग करेगा।


असंबंधित ठोस समस्या के लिए, यह पता चला है कि JSF2 में <f:selectItems> आप मैन्युअल रूप से SelectItem की एक सूची का निर्माण करने की आवश्यकता के बिना सूची बनाने के लिए संभावना प्रदान करता है उपयोगी हो सकता है।

<f:selectItems value="#{userHome.availableLeaders}" var="user" 
    itemValue="#{user}" itemLabel="#{user.name}" /> 

यह आपको अतिरिक्त selectItems संपत्ति और सेम निर्माता में पाश से छुटकारा पाने के लिए अनुमति देता है: यहाँ एक उदाहरण है जो बिल्कुल वैसा ही प्राप्त होता है।

+1

+1 का चयन बैकिंग बीन से SelectItem प्रकार को रखने के लिए और इसे डोमेन ऑब्जेक्ट्स की सरल सूचियों का उपयोग करने के लिए +1;) –

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