2016-08-01 25 views
1

Ich entwickle eine Anwendung mit Play 2.5. Modelle und Formulardaten sind separate Klassen, daher habe ich eine Klasse "Page" und "PageForm".Play 2.5: Formvalidierung - bei Fehler ist der Wert des Formulars "Optional.empty"

In PageForm ist eine Methode "validate()", die, wenn es keine null zurück war Fehler oder eine Liste, wenn die Validierung fehlgeschlagen:

public List<ValidationError> validate() { 
    List<ValidationError> errors = new ArrayList<>(); 

    Page checkForDuplicatePage = PageRepository.getInstance().getByName(name); 

    if(checkForDuplicatePage != null && checkForDuplicatePage.id != id) { 
     errors.add(new ValidationError("name", "The name is already in use by another page")); 
    } 

    // ... 

    return errors.isEmpty() ? null : errors; 
} 

Ich nenne In meinem Controller:

Form<PageForm> form = formFactory(PageForm.class).bindFromRequest(); 

Dies funktioniert sehr gut, wenn die Daten im Formular korrekt sind. Wenn validate() jedoch einen Fehler findet (und es spielt keine Rolle, um welche Art es sich handelt, auch wenn return new ArrayList<>() dies auslöst), ist das Attribut "value" meines Formulars "Optional.empty". Das Attribut "data" enthält alle Daten, die an das Formular übergeben werden.

Das bedeutet, dass ich das Formular nicht verwenden kann, um es an meine Ansicht zu übergeben, die die Daten mit Fehlermeldungen anzeigen sollte. Stattdessen bekomme ich eine [CompletionException: java.util.NoSuchElementException: No value present]. Manchmal (ich habe nicht herausgefunden, warum das noch passiert) sagt es auch [CompletionException: java.util.NoSuchElementException: None.get].

Ich habe meinen Code mit anderen Projekten und den offiziellen Dokumenten verglichen, aber alle scheinen zu tun, was ich hier habe.

Antwort

0

Ich benutze Scala Play statt Java, also YMMV. Aber für mich glaube ich nicht, dass validatenull überhaupt zurückgeben sollte. Es sollte das leere ArrayList zurückgeben, wenn keine Fehler vorliegen. Ich vermute, dass dies die None.get Fehlermeldung beseitigen wird. Ich bin mir jedoch nicht sicher, wie viel ich helfen kann, weil ich nicht wirklich verstehe, was dein Code eigentlich machen soll. Zum Beispiel der Satz

Wenn jedoch validate() findet einen Fehler (und es ist wirklich egal, welche Art, auch eine Rückkehr neue Arraylist <>() löst dies)

scheint irgendwie zweideutig für mich. Wo ist der return new ArrayList<>() Aufruf, der den Fehler auslöst?