JSF 2 - Bean-Validierung: Validierung fehlgeschlagen -> leere Werte werden durch die letzten gültigen Werte der verwalteten Bean ersetzt


Ich verstehe das Verhalten von JSF2 während der Validierung nicht. Hoffe jemand kann mir helfen.

Ich habe ein Formular, in dem die Felder nach dem Absenden (Ajax) validiert werden - ok
Wenn die Validierung fehlgeschlagen ist, wird eine Fehlermeldung angezeigt - ok

Für mein Beispiel, wenn ich ein gültiges @ eingeGeburtsta und das FeldNam ist leer eine Fehlermeldung fürNam wird nach dem Absenden angezeigt.
Jetzt wenn ich ein gültiges @ eingeNam und lösche die Eingabe aus demGeburtsta Feld eine Fehlermeldung wird angezeigt fürGeburtsta (das ist ok) aber jetzt das alte 'gültige'Geburtsta steht auch im Eingabefeld!?!

Wie kann ich dieses Verhalten vermeiden? Wenn ich ein leeres Feld einreiche, möchte ich eine Fehlermeldung und ein leeres Feld sehen ...

Hier ist mein Beispielcode:

Ich verwende eine ManagedBean TestBean) mit einer EntityBean Kontak). DasKontak enthält Validierungen pro Annoationen.

public class Contact implements Serializable {
    @NotNull 
    @Temporal(TemporalType.DATE)
    private Date birthday;

    @NotNull 
    @Size(min=3, max=15)
    private String name;

    //...
}

My ManagedBean:

@ManagedBean
@ViewScoped
public class TestBean implements Serializable {
    private Contact contact;

    @PostConstruct
    void init() {
        System.out.println("init...");
        contact = new Contact(); 
    }

    public void newContact(ActionEvent ae) {
        System.out.println("newContact...");
        contact = new Contact();
    }

    public void save() {
        System.out.println("save...");
        //TODO do something with contact...
    }

    public Contact getContact() { return contact; }

    public void setContact(Contact contact) {this.contact = contact;}
}

An hier meine JSF Seite:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core" >      
 <h:body>
    <h:form>     
        <h:panelGrid columns="3">   

        <h:outputText value="Birthday: " />  
        <h:inputText id="birthday" value="#{testBean.contact.birthday}">
            <f:convertDateTime/>
        </h:inputText>  
        <h:message for="birthday" />  

        <h:outputText value="Name: " />  
        <h:inputText id="name" value="#{testBean.contact.name}"/>
        <h:message for="name" />

        </h:panelGrid>  

        <h:commandButton value="submit" action="#{testBean.save}"> 
            <f:ajax execute="@form" render="@form"/>
        </h:commandButton> 

        <h:commandButton value="newContact" actionListener="#{testBean.newContact}"
                         immediate="true"> 
            <f:ajax render="@form"/>
        </h:commandButton> 

    </h:form>
</h:body>
</html>

Als letztes ein Snippet aus web.xml

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>true</param-value>
</context-param>

Danke für ein paar Tipps

Antworten auf die Frage(8)

Ihre Antwort auf die Frage