2012-07-09 32 views
7

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,

Trả lời

4

Tôi đã gặp vấn đề tương tự và vì tôi không thể đoán được đây là Play! lỗi hoặc sử dụng xấu từ tôi, tôi đã kết thúc viết lớp Form của riêng mình bằng cách mở rộng lớp hiện tại Form.

Bạn có thể tìm lớp học của tôi ở đây: https://gist.github.com/3074629

Chỉ cần đặt lớp này trong một gói phần mềm được gọi là patch, sau đó, trong điều khiển của bạn, bạn sẽ phải sử dụng:

Form<UserForm> userForm = new PatchedForm<UserForm>(UserForm.class).bindFromRequest(); 

Và nó nên làm it ;-)

Bây giờ, tôi phải điền lỗi và yêu cầu kéo vào nhóm Phát ...

+0

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. –

+0

@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

8

Đó là lỗi khi phát. Nếu biểu mẫu của bạn thực hiện xác thực chỉ cần đảm bảo phương thức trả về null bất cứ khi nào không có lỗi.Nếu bạn trả lại bản đồ trống thì nó sẽ thất bại

Các vấn đề liên quan