2012-07-09 1 views
7

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,

Odpowiedz

4

uderzę ten sam problem, a ponieważ nie był w stanie zorientować się, czy to jest grać! bug lub złe wykorzystanie przeze mnie, napisałem własną klasę Form przez rozszerzenie istniejącej klasy Form.

można znaleźć moją klasę tutaj: https://gist.github.com/3074629

wystarczy umieścić tę klasę w pakiecie o nazwie patch, a następnie, w kontroler, będziesz musiał użyć:

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

A powinien dokonać to ;-)

teraz muszę wypełnić błąd i żądania ściągania do zespołu Play ...

+0

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

+0

@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

8

jest to błąd na grę. Jeśli twój formularz implementuje sprawdzanie poprawności, upewnij się, że metoda zwraca wartość null, gdy nie ma błędów.Jeśli zwrócisz pustą mapę, to się nie powiedzie