Próbowałem napisać niestandardowy weryfikator formularza dla gry 2.0.1, używając adnotacji JSR-303 (na poziomie klasy) i implementacji poprawności.Playframework IllegalStateException po sprawdzeniu poprawności formularza
Niestety, po wysłaniu formularza i sprawdzeniu poprawności kończy się niepowodzeniem. Otrzymuję wyjątek IllegalStateException, który może być błędem gry (ale chciałbym potwierdzić).
Poniżej znajduje odpowiednich fragmentów kodu i opisu problemu (tylko odpowiednich części dla jasności)
część kodu kontrolera (odbiór forma przedstawienia)
public static Result save() {
Form<UserForm> userForm = form(UserForm.class).bindFromRequest();
if (userForm.hasErrors()) {
return badRequest(createForm.render(userForm));
}
UserForm user = userForm.get();
Walidator jest zadeklarowane jako
public class FieldMatchValidator extends Validator<Object>
implements ConstraintValidator<FieldMatch, Object>
Adnotacja walidacja jest zadeklarowana jako
@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 {};
Złożenie formularza pojawia się błąd
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]
Wspomniana linia UsersController jest użytkownik wezwanie UserForm = userForm.get();
Próbując zrozumieć, gdzie leży problem, okazało się, że kod naruszający prawa jest prawdopodobnie w Form.java gry.
bind Form (dane Mapa, String ... allowedFields) zawiera:
if(result.hasErrors()) {
for(FieldError error: result.getFieldErrors()) {
...
}
return new Form(rootName, backedType, data, errors, None());
}
A hasErrors() jest
public boolean hasErrors() {
return !errors.isEmpty();
}
Co się dzieje, że result.hasErrors() zwraca true (ponieważ sprawdzanie poprawności zdefiniowane na poziomie klasy nie powiodło się), ale lista błędów wbudowanych pozostaje pusta (result.getFieldErrors() zwraca pustą listę).
W konsekwencji Form.hasErrors() zwraca wartość false, ale funkcja Form.get() kończy się niepowodzeniem.
Czy brakuje mi czegoś lub jest to w rzeczywistości błąd?
Dzięki i pozdrawiam,
Dzięki za komentarz. "Przepracowałem" problem implementujący funkcję "sprawdzania poprawności" na poziomie modelu (jak wyjaśniono w dokumentacji gry). Tylko obejście, a właściwie rozwiązanie. –
@JohnSmith Hi John. Myślę, że mogę mieć podobny problem z tym przy użyciu nowszego typu java.time.LocalDate. Czy możesz opublikować coś, pokazując, jak to zrobiłeś? Wszelka dokumentacja dotycząca implementacji sprawdzania poprawności wydaje się być ważna tylko dla znacznie starszej wersji gry! – svaens