2013-07-21 6 views
5

मेरे पास एक इनपुट टेक्स्ट घटक वाला एक पृष्ठ है जो required="true" के रूप में चिह्नित है और सर्वर पक्ष में एक कस्टम Validator है।क्लाइंट में इनपुट हटा दिए जाने पर सत्यापनकर्ता छोड़ दिया गया - क्या यह जेएसएफ विनिर्देश के अनुसार है?

अब ग्राहक के रूप में, मैं उस घटक द्वारा प्रदान किए गए HTML तत्व के बिना पृष्ठ सबमिट करता हूं (ब्राउज़र के अंतर्निहित डीओएम तत्व निरीक्षक का उपयोग करके इसे डीओएम पेड़ से तत्व को हटाकर आसानी से हासिल किया जा सकता है)। फॉर्म को इस आवश्यक घटक के सर्वर साइड सत्यापन के बिना सफलतापूर्वक सबमिट किया गया है।

क्या यह जेएसएफ विनिर्देश के अनुसार है? क्या यह निर्दिष्ट करने का कोई तरीका है कि पृष्ठ में वैधकर्ता निष्पादित किए जाने चाहिए, भले ही पोस्ट किए गए पृष्ठ में उन्हें शामिल न किया जाए?

उत्तर

4

यह विनिर्देश के अनुसार है। यहाँ UIInput#validate() javadoc से प्रासंगिकता के एक उद्धरण है:

getSubmittedValue() के साथ प्रस्तुत मूल्य प्राप्त करें। यदि यह null, को आगे संसाधित किए बिना बाहर निकलता है। (यह इंगित करता है कि इस घटक के लिए कोई मूल्य सबमिट नहीं किया गया था।)

एक खाली इनपुट एक खाली स्ट्रिंग भेज देगा, null नहीं। इनपुट की पूरी अनुपस्थिति null, खाली स्ट्रिंग नहीं भेजेगी।

चाहे वह हानिकारक है या नहीं, व्यवसाय तर्क पर निर्भर करता है। एक निर्णायक रूप से डिज़ाइन किया गया मॉडल (व्यवसाय तर्क और/या डेटा मॉडल) जो null पर अपेक्षित मामले के रूप में नहीं मानता है, कहीं भी शून्य सूचक अपवाद, या SQL बाधा उल्लंघन (NOT NULL) का कारण बनता है, जो आमतौर पर HTTP 500 त्रुटि प्रतिक्रिया में समाप्त होता है । लेकिन अगर मॉडल वास्तव में null को अपेक्षित मामले के रूप में मानता है, तो यह मॉडल में एक गलती है। दृश्य (जेएसएफ पृष्ठ), केवल मॉडल पेश करने का इरादा रखता है, उसके बाद इसके खिलाफ थोड़ा सा कर सकता है।

व्यापार तर्क या डेटा मॉडल वास्तव में एक असाधारण मामले के रूप में null विचार करने के लिए नहीं बदला जा सकता है (अर्थात मान कभी नहीं/null के रूप में दिया महत्व को स्वीकार करते), और आप जेपीए उपयोग करने के लिए होता है, तो आपका सर्वश्रेष्ठ दांव जोड़ने के लिए है संपत्ति पर @NotNull। जबकि जेएसएफ इस पर सत्यापन को बाईपास करेगा, जेपीए अभी भी इसे मान्य करेगा, फिर भी एक अपवाद और HTTP 500 त्रुटि उत्पन्न करेगा। मैं इस मामले में केवल आश्चर्यचकित हूं कि डीबी कॉलम में पहले स्थान पर NOT NULL बाधा क्यों नहीं है। वैकल्पिक रूप से, class level validation करें।

ध्यान दिया जाना चाहिए कि MyFaces इस पर नीचे की तरह एक चेतावनी लॉग:

मार्च 16, वर्ष 2016 08:55:52 org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils decodeUIInput
चेतावनी : यदि इसे प्रस्तुत किया जाता है तो इनपुट के लिए हमेशा एक सबमिट मूल्य होना चाहिए, इसका फॉर्म सबमिट किया गया है, और इसे मूल रूप से अक्षम या केवल पढ़ने के लिए प्रस्तुत नहीं किया गया था। जावास्क्रिप्ट के माध्यम से इनपुट तत्व को अक्षम करने के बाद आप कोई फॉर्म सबमिट नहीं कर सकते हैं। प्रपत्र सबमिट करने से पहले केवल गलत पढ़ने के लिए या अक्षम मूल्य को वापस गलत पर सेट करने पर विचार करें।
घटक: {घटक-पथ: [कक्षा: javax.faces.component.UIViewRoot, ViewId: /test.xhtml ][Class: javax.faces.component.html.HtmlBody, आईडी: j_id_5] [कक्षा: javax.faces .component.html.HtmlForm, क्रमांक: j_id_6] [कक्षा: javax.faces.component.html.HtmlInputText, क्रमांक: j_id_7] स्थान: पंक्ति 22 और स्तंभ पर /test.xhtml 33}

+0

प्रदान करने के लिए धन्यवाद जावाडोक निकालने, यह व्यवहार को स्पष्ट रूप से बताता है।जैसा कि आपके द्वारा उल्लिखित किया गया है, यह नुकसान तर्कसंगत तर्क पर निर्भर करता है: एक शून्य सूचक अपवाद से पहले एक अनुप्रयोग स्कोप्ड ऑब्जेक्ट को आंशिक रूप से अपडेट कर सकता है, इस प्रकार पूरे एप्लिकेशन को क्रैश कर सकता है। क्या आप प्रश्न के दूसरे भाग का भी उत्तर दे सकते हैं: क्या प्रमाणीकरण अनिवार्य हो सकता है, भले ही इनपुट शून्य हो? – mittal

+0

जेएसएफ हैकिंग के बिना नहीं। यदि आप ओमनीफेस का उपयोग करते हैं, तो आपकी सबसे अच्छी शर्त बीवी (जेएसआर 303 बीन सत्यापन; '@ नोटनुल' और दोस्तों) को '' के माध्यम से मजबूर कर रही है जो वर्ग स्तर बीन सत्यापन का समर्थन करती है। – BalusC

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