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




jsf jpa (2)

मुझे एपी के साथ समस्या है: 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] 

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

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

छेड़छाड़ / हैक किए गए अनुरोधों के खिलाफ सुरक्षा के हिस्से के रूप में, जेएसएफ सभी उपलब्ध चुनिंदा आइटम मूल्यों पर दोहराएगा और परीक्षण किया जाएगा यदि selectedItem.equals(availableItem) कम से कम एक उपलब्ध आइटम मान के लिए true देता 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 बजाय बीन @ViewScoped बनाना अधिकांश मामलों में इसे ठीक करना चाहिए। यह भी सुनिश्चित करें कि आप <f:selectItem(s)> की गेटर विधि में व्यवसाय तर्क नहीं करते हैं, बल्कि इसके बजाय @PostConstruct या एक क्रिया ईवेंट (श्रोता) विधि में। यदि आप विशिष्ट अनुरोध पैरामीटर पर भरोसा कर रहे हैं, तो आपको उन्हें स्पष्ट रूप से @ViewScoped बीन में स्टोर करना होगा, या बाद में अनुरोधों पर उन्हें फिर से पास करना होगा जैसे <f:param> । सही बीन स्कोप का चयन कैसे करें देखें ?
  2. सुनिश्चित करें कि equals() विधि सही लागू की गई है। यह पहले से ही जावा जावा प्रकारों जैसे java.lang.String , java.lang.Number , आदि पर किया गया है, लेकिन कस्टम ऑब्जेक्ट्स / सेम ​​/ एंटीइट्स पर जरूरी नहीं है। बराबर अनुबंध लागू करने का सही तरीका भी देखें। यदि आप पहले से String का उपयोग कर रहे हैं, तो सुनिश्चित करें कि अनुरोध वर्ण एन्कोडिंग सही कॉन्फ़िगर किया गया है। यदि इसमें विशेष वर्ण हैं और जेएसएफ आउटपुट को यूटीएफ -8 के रूप में प्रस्तुत करने के लिए कॉन्फ़िगर किया गया है लेकिन इनपुट की व्याख्या करें जैसे आईएसओ -885 9 -1, तो यह असफल हो जाएगा। प्राइमफेस इनपुट घटकों के माध्यम से पुनर्प्राप्त एओ यूनिकोड इनपुट भी दूषित हो जाता है ।
  3. डीबग / अपने कस्टम Converter के कार्यों को लॉग इन करें और तदनुसार इसे ठीक करें। दिशानिर्देशों के लिए, 'null कनवर्टर' के लिए रूपांतरण त्रुटि सेटिंग मान भी देखें यदि आप java.util.Date को <f:convertDateTime> साथ उपलब्ध वस्तुओं के रूप में उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप पैटर्न में पूर्णकालिक भाग को न भूलें । एफ: डेटाटाइम कनवर्टर से भी "सत्यापन त्रुटि: मान मान्य नहीं है" त्रुटि भी देखें।

यह भी देखें:

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

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


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

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

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







selectonemenu