Tôi đã cố gắng viết trình xác thực biểu mẫu tùy chỉnh để phát 2.0.1 bằng cách sử dụng chú thích JSR-303 (cấp lớp) và triển khai trình xác thực.Playframework IllegalStateException sau khi xác thực biểu mẫu
Thật không may, khi tôi gửi biểu mẫu và xác thực không thành công, tôi nhận được một IllegalStateException có thể là lỗi của trò chơi (nhưng tôi muốn xác nhận).
Hãy tìm thấy bên dưới các chiết xuất mã có liên quan và các mô tả vấn đề (chỉ phần có liên quan vì lợi ích rõ ràng của)
Một phần của mã điều khiển (nhận gửi biểu mẫu có)
public static Result save() {
Form<UserForm> userForm = form(UserForm.class).bindFromRequest();
if (userForm.hasErrors()) {
return badRequest(createForm.render(userForm));
}
UserForm user = userForm.get();
Các validator được khai báo là
public class FieldMatchValidator extends Validator<Object>
implements ConstraintValidator<FieldMatch, Object>
chú thích xác nhận được khai báo là
@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 {};
Nộp mẫu đơn tôi nhận được lỗi
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]
Các đề cập dòng UsersController là người sử dụng gọi UserForm = userForm.get();
Cố gắng tìm hiểu vấn đề ở đâu mà tôi thấy rằng mã vi phạm có thể là trong Form.java của trò chơi.
Mẫu bind (dữ liệu Bản đồ, String ... allowedFields) chứa:
if(result.hasErrors()) {
for(FieldError error: result.getFieldErrors()) {
...
}
return new Form(rootName, backedType, data, errors, None());
}
Và hasErrors() là
public boolean hasErrors() {
return !errors.isEmpty();
}
gì xảy ra là result.hasErrors() trả về true (vì trình xác nhận hợp lệ được xác định ở cấp lớp không thành công), nhưng danh sách lỗi được xây dựng vẫn trống (result.getFieldErrors() trả về một danh sách trống).
Kết quả là Form.hasErrors() trả về false nhưng Form.get() bị lỗi.
Tôi có thiếu thứ gì đó hay thực sự là lỗi?
Xin cảm ơn và kính trọng,
Cảm ơn nhận xét của bạn. Tôi "workaround" vấn đề thực hiện chức năng "xác nhận" ở cấp mô hình (như được giải thích trong tài liệu chơi). Chỉ có một giải pháp thực sự, không thực sự là một giải pháp. –
@JohnSmith Hi John. Tôi nghĩ rằng tôi có thể có một vấn đề tương tự với điều này bằng cách sử dụng loại mới hơn java.time.LocalDate. Bạn có thể gửi một cái gì đó cho thấy cách bạn đã làm điều này? Bất kỳ tài liệu nào tôi có thể tìm thấy liên quan đến việc thực hiện xác nhận có vẻ chỉ hợp lệ đối với phiên bản cũ hơn nhiều của trò chơi! – svaens