मैंने जेएसआर -303 एनोटेशन (कक्षा-स्तर) और सत्यापनकर्ता कार्यान्वयन का उपयोग करके 2.0.0 के लिए एक कस्टम फॉर्म सत्यापनकर्ता लिखने का प्रयास किया।प्लेफ्रेमवर्क अवैध सत्यापन के बाद फॉर्म सत्यापन
दुर्भाग्यवश, जब मैं फॉर्म जमा करता हूं और सत्यापन विफल रहता है तो मुझे एक अवैध स्टेटस अपवाद मिलता है जो एक नाटक की बग हो सकती है (लेकिन मैं पुष्टि करना चाहता हूं)।
कृपया प्रासंगिक कोड अर्क और समस्या का विवरण (स्पष्टता की खातिर ही प्रासंगिक भागों) नियंत्रक कोड के
भाग (प्रपत्र सबमिट प्राप्त)
public static Result save() {
Form<UserForm> userForm = form(UserForm.class).bindFromRequest();
if (userForm.hasErrors()) {
return badRequest(createForm.render(userForm));
}
UserForm user = userForm.get();
सत्यापनकर्ता के रूप में घोषित किया जाता है नीचे खोजने के लिए
public class FieldMatchValidator extends Validator<Object>
implements ConstraintValidator<FieldMatch, Object>
सत्यापन एनोटेशन
के रूप में घोषित किया जाता है@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
@play.data.Form.Display(name="constraint.fieldmatch")
public @interface FieldMatch {
String message() default FieldMatchValidator.message;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
प्रपत्र मैं त्रुटि
Caused by: java.lang.IllegalStateException: No value
at play.libs.F$None.get(F.java:217) ~[play_2.9.1.jar:2.0.1]
at play.data.Form.get(Form.java:363) ~[play_2.9.1.jar:2.0.1]
at controllers.UsersController.save(UsersController.java:40) ~[classes/:2.0.1]
at Routes$$anonfun$routes$1$$anonfun$apply$25$$anonfun$apply$26.apply(routes_routing.scala:189) ~[classes/:na]
at Routes$$anonfun$routes$1$$anonfun$apply$25$$anonfun$apply$26.apply(routes_routing.scala:189) ~[classes/:na]
at play.core.Router$HandlerInvoker$$anon$4$$anon$1.invocation(Router.scala:1086) ~[play_2.9.1.jar:2.0.1]
उल्लेख UsersController की लाइन प्राप्त भेजने से कॉल UserForm उपयोगकर्ता = userForm.get() है;
यह समझने की कोशिश कर रहा है कि समस्या कहां है कि अपमानजनक कोड संभवतः play.java में है।
फार्म बाँध (नक्शा डेटा, स्ट्रिंग ... allowedFields) शामिल हैं:
if(result.hasErrors()) {
for(FieldError error: result.getFieldErrors()) {
...
}
return new Form(rootName, backedType, data, errors, None());
}
और hasErrors()
public boolean hasErrors() {
return !errors.isEmpty();
}
है क्या होता है कि result.hasErrors() सच रिटर्न है (क्योंकि वर्ग स्तर पर परिभाषित वैधकर्ता असफल रहा), लेकिन निर्मित त्रुटियों की सूची खाली बनी हुई है (परिणाम .getFieldErrors() एक खाली सूची देता है)।
परिणामस्वरूप फॉर्म.hasErrors() झूठी वापसी करता है लेकिन Form.get() विफल रहता है।
क्या मुझे कुछ याद आ रहा है या वास्तव में यह एक बग है?
धन्यवाद और सादर,
आपकी टिप्पणी के लिए धन्यवाद विफल हो जाएगा। मैं मॉडल स्तर पर "मान्य" फ़ंक्शन को लागू करने में समस्या का काम करता हूं (जैसा कि प्ले डॉक्यूमेंटेशन में बताया गया है)। वास्तव में केवल एक समाधान, वास्तव में एक समाधान नहीं है। –
@ जॉनस्मिथ हाय जॉन। मुझे लगता है कि मुझे नए प्रकार java.time.LocalDate का उपयोग करके इस तरह की एक ही समस्या हो सकती है। क्या आप कुछ दिखा सकते हैं कि आपने यह कैसे किया? प्रमाणीकरण लागू करने के संबंध में मुझे जो भी दस्तावेज मिल सकता है वह केवल खेल के पुराने संस्करण के लिए मान्य है! – svaens