सत्यापन त्रुटि: मान मान्य नहीं है


80

मुझे एपी के साथ एक समस्या है: selectOneMenu, कोई फर्क नहीं पड़ता कि मैं क्या करूं जेएसएफ इकाई पर सेटर को कॉल करने के लिए जेएसएफ नहीं मिल सकता है। जेएसएफ सत्यापन इस संदेश के साथ विफल रहता है:

फ़ॉर्म: स्थान: सत्यापन त्रुटि: मान मान्य नहीं है

मेरे पास एक ही प्रकार के कई अन्य वर्ग पर काम कर रहा है (यानी, टेबल क्लासेस ज्वाइन करें) लेकिन मेरे जीवन के लिए यह एक काम नहीं हो सकता।

यदि कोई इस तरह की समस्या के लिए कुछ समस्या निवारण / डिबगिंग युक्तियां फेंक सकता है, तो इसकी बहुत सराहना की जाएगी।

लॉग स्टेटमेंट्स का उपयोग करके मैंने निम्नलिखित को सत्यापित किया है:

  1. Conveterसही, गैर लौटने है nullमान।
  2. मेरी जेपीए संस्थाओं में कोई बीन मान्यता नहीं है।
  3. सेटर setLocation(Location location)कभी नहीं कहा जाता है।

यह सबसे सरल उदाहरण है जो मैं कर सकता हूं और यह बस काम नहीं करेगा:

<h:body>
    <h:form id="form">
        <p:messages id="messages" autoUpdate="true" />
        <p:selectOneMenu id="location" value="#{locationStockList.selected.location}" converter="locationConverter">
            <p:ajax event="change" update=":form:lblLocation"/>
            <f:selectItems value="#{locationStockList.locationSelection}"/>
        </p:selectOneMenu>
    </h:form>
</h:body>

कनवर्टर:

@FacesConverter(forClass=Location.class, value="locationConverter")
public class LocationConverter implements Converter, Serializable {
    private static final Logger logger = Logger.getLogger(LocationConverter.class.getName());

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value.isEmpty())
            return null;
        try {
            Long id = Long.parseLong(value);
            Location location = ((LocationManagedBean) context.getApplication().getELResolver().getValue(context.getELContext(), null, "location")).find(id);
            logger.log(Level.SEVERE, "Converted {0} to {1}" , new Object[] {value, location});
            return location;
        } catch (NumberFormatException e) {
            return new Location();
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value == null || value.toString().isEmpty() || !(value instanceof Location))
            return "";
        return String.valueOf(((Location) value).getId());
    }    
}

कंसोल आउटपुट:

// Getter method
INFO: Current value=ejb.locations.Location[id=null, name=null, latitude=0.0, longitude=0.0] 
// Session Bean
INFO: Finding ejb.locations.Location with id=3 
// Session Bean
INFO: ### Returning : ejb.locations.Location[id=3, name=mdmd, latitude=4.5, longitude=2.3] 
// Converter
SEVERE: Converted 3 to ejb.locations.Location[id=3, name=mdmd, latitude=4.5, longitude=2.3] 
// Getter method -> Where did my selected Location go ??
INFO: Current value=ejb.locations.Location[id=null, name=null, latitude=0.0, longitude=0.0] 

जवाबों:


143

सत्यापन "संदेश: फ़ॉर्म: स्थान: सत्यापन त्रुटि: मान मान्य नहीं है" के साथ विफल हो जाता है

यह त्रुटि इस बात पर उबलती है कि चयनित आइटम <f:selectItem(s)> अनुरोध सबमिट करने की प्रक्रिया के दौरान किसी भी नेस्टेड टैग द्वारा निर्दिष्ट उपलब्ध चयनित आइटम मूल्यों से मेल नहीं खाता है ।

छेड़छाड़ / हैक किए गए अनुरोधों के खिलाफ सुरक्षा के हिस्से के रूप में, जेएसएफ सभी उपलब्ध चुनिंदा आइटम मूल्यों पर फिर से दोहराएगा और कम से कम एक उपलब्ध आइटम मूल्य के लिए selectedItem.equals(availableItem) रिटर्न का परीक्षण करेगा true। यदि कोई एक आइटम मूल्य मेल नहीं खाता है, तो आपको वास्तव में यह सत्यापन त्रुटि मिलेगी।

यह प्रक्रिया मूल रूप से नीचे के कवर के तहत है, जिसके द्वारा bean.getAvailableItems()काल्पनिक रूप से उपलब्ध चयनित वस्तुओं की पूरी सूची को परिभाषित किया गया है <f:selectItem(s)>:

String submittedValue = request.getParameter(component.getClientId());
Converter converter = component.getConverter();
Object selectedItem = (converter != null) ? converter.getAsObject(context, component, submittedValue) : submittedValue;

boolean valid = false;

for (Object availableItem : bean.getAvailableItems()) {
    if (selectedItem.equals(availableItem)) {
        valid = true;
        break;
    }
}

if (!valid) {
    throw new ValidatorException("Validation Error: Value is not valid");
}

इसलिए, उपरोक्त तर्क के आधार पर, यह समस्या कम से कम निम्नलिखित कारणों से हो सकती है:

  1. उपलब्ध आइटमों की सूची में चयनित आइटम गायब है।
  2. equals()चयनित आइटम का प्रतिनिधित्व करने वाली कक्षा की विधि गायब या टूटी हुई है।
  3. यदि कोई प्रथा Converterशामिल है, तो इसमें गलत वस्तु वापस आ गई है getAsObject()। शायद यह भी है null

इसे हल करने के लिए:

  1. सुनिश्चित करें कि ठीक उसी सूची को बाद के अनुरोध के दौरान संरक्षित किया गया है, खासकर कई कैस्केडिंग मेनू के मामले में। बीन बनाने के @ViewScopedबजाय @RequestScopedइसे ज्यादातर मामलों में ठीक करना चाहिए। यह भी सुनिश्चित करें कि आप गेट के तरीके में व्यावसायिक तर्क का प्रदर्शन नहीं करते हैं <f:selectItem(s)>, लेकिन इसके बजाय @PostConstructएक एक्शन इवेंट (श्रोता) विधि में। यदि आप विशिष्ट अनुरोध मापदंडों पर भरोसा कर रहे हैं, तो आपको उन्हें @ViewScopedबीन में स्पष्ट रूप से संग्रहीत करने की आवश्यकता होगी , या बाद के अनुरोधों पर उन्हें फिर से पारित करने के लिए जैसे <f:param>। यह भी देखें कि सही बीन गुंजाइश कैसे चुनें?
  2. सुनिश्चित करें कि equals()विधि सही तरीके से लागू की गई है। यह पहले से ही सही इस तरह के रूप मानक जावा प्रकार पर किया जाता है java.lang.String, java.lang.Numberआदि, लेकिन जरूरी नहीं कि कस्टम वस्तुओं / सेम / entites पर। समान अनुबंध को लागू करने का सही तरीका भी देखें । यदि आप पहले से उपयोग कर रहे हैं String, तो सुनिश्चित करें कि अनुरोध वर्ण एन्कोडिंग सही कॉन्फ़िगर किया गया है। यदि इसमें विशेष वर्ण हैं और आउटपुट को UTF-8 के रूप में प्रस्तुत करने के लिए JSF कॉन्फ़िगर किया गया है, लेकिन इनपुट को उदाहरण के लिए ISO-8859-1 के रूप में व्याख्या करता है, तो यह विफल हो जाएगा। यह भी देखें कि एफ़ यूनिकोड इनपुट प्राइमफेस इनपुट घटकों के माध्यम से पुनर्प्राप्त भ्रष्ट हो जाते हैं
  3. अपने रिवाज की क्रियाओं को डीबग / लॉग करें Converterऔर उसके अनुसार इसे ठीक करें। दिशानिर्देशों के लिए, 'null Converter' के लिए रूपांतरण त्रुटि सेटिंग मान भी देखें । यदि आप java.util.Dateउपलब्ध आइटम का उपयोग कर रहे हैं <f:convertDateTime>, तो सुनिश्चित करें कि आप पैटर्न में पूर्णकालिक भाग नहीं भूलते हैं। "वैधता त्रुटि: मान मान्य नहीं है" यह भी देखें f: datetimeConverter से त्रुटि

यह सभी देखें:


यदि कोई इस तरह की समस्या के लिए कुछ समस्या निवारण / डिबगिंग युक्तियां फेंक सकता है, तो इसकी बहुत सराहना की जाएगी।

यहाँ एक स्पष्ट और ठोस प्रश्न पूछें। बहुत व्यापक प्रश्न न पूछें;)


@ बालसुख: जहाँ वास्तव में यह मोहर्रा कोड में है, कि यह equalsजाँच होती है। मेरी स्थिति थोड़ी जटिल है। मैं अपना स्वयं का कस्टम घटक बनाता हूं जो उपयोगकर्ता को जटिल रेडियो लेआउट रखने की अनुमति देता है। यह ठीक काम करता है अगर मेरे पास सिर्फ एक रेडियो समूह है (f: selectItems सही मेरे कस्टम घटक के नीचे)। हालाँकि, लेआउट अधिक जटिल हो जाता है (कई रेडियो समूह, प्रत्येक का अपना f: selectItems होता है, लेकिन सभी समान चयन साझा करते हैं), मुझे f: selectItems को ui के अंदर रखना होगा: दोहराना, फिर ui: दोहराना मेरे कस्टम घटक के अंतर्गत है। मैं फिर इस मुद्दे पर भाग गया। मैं मोजरा कोड देखना चाहता हूं जो इसे संभालता है
थांग फाम

इसके अलावा मेरे f: selectItems स्ट्रिंग प्रकार है, इसलिए मुझे यकीन है कि यह रूपांतरण समस्या नहीं है, मुझे लगता है कि यह कारण है क्योंकि f: selectItems की सूची सत्यापन चरण के दौरान नहीं है।
थांग फाम

क्या आप एफ का उपयोग करने के बारे में विस्तार से बता सकते हैं: प्रबंधित बीन में राज्य भेजने के लिए ताकि यह "राज्य" को फिर से बना सके? धन्यवाद।
अगस्टी सैंचेज़

1
एक समान त्रुटि होना। मैं SelectItemsConverter का उपयोग कर रहा हूं और यह घटक अक्षम फ़ील्डसेट के अंदर है - इसलिए यह अक्षम भी है। क्या यह एक ज्ञात व्यवहार है?
गिल्बर्टो

यदि आप प्रदर्शित करने के लिए आइटम के लिए एनम का उपयोग कर रहे हैं और आपके बैकिंग बीन में मूल्य निर्धारित करने के लिए स्ट्रिंग प्रकार है और किसी भी कन्वर्टर्स का उपयोग नहीं करने पर आपको वही त्रुटि मिलेगी। यही कारण है कि मैं यहाँ समाप्त हुआ।
फिलिप पुथेनविला

2

मेरे मामले में मैं सही तरीके / सेट विधियों को लागू करना भूल गया। ऐसा इसलिए हुआ क्योंकि मैंने विकास के साथ बहुत सारी विशेषताओं को बदल दिया है।

एक उचित तरीके के बिना, JSF आपके चयनित आइटम को पुनर्प्राप्त नहीं कर सकता है, और ऐसा होता है कि BalusC ने अपने उत्तर के आइटम 1 पर क्या कहा है:

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


1

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

उदाहरण:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + (int) (id ^ (id >>> 32));
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Location other = (Location) obj;
    if (id != other.id)
        return false;
    return true;
}
  • कृपया ध्यान दें कि उपरोक्त उदाहरण 'आईडी' प्रकार का है।

जैसा कि स्वीकृत और अत्यधिक
उत्क्रमित
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.