Non capisco il comportamento di JSF2 durante la valdation. Spero che qualcuno possa aiutarmi.JSF 2 - Convalida del bean: convalida non riuscita -> i valori vuoti vengono sostituiti con gli ultimi valori validi dal bean gestito
Ho una forma in cui i campi sono convalidati dopo (Ajax) presentare - ok
Se la convalida non è riuscita viene visualizzato un messaggio di errore - ok
Per il mio esempio, quando entro in una valida compleanno e la il campo nome è vuoto un messaggio errato per nome viene visualizzato dopo l'invio.
Ora, quando entro in un nome valido ed eliminare l'ingresso dal compleanno campo un messaggio d'errore è spettacolo per compleanno (che è ok), ma ora il vecchio 'valida' compleanno si distingue anche nel campo di input! ?!
Come posso evitare questo comportamento? Quando presento un campo vuoto Voglio vedere un messaggio d'errore e un campo vuoto ...
Ecco il mio codice di esempio:
io uso un ManagedBean (TestBean) che contiene un EntityBean (Contatto). Il contatto contiene convalide per i commenti.
public class Contact implements Serializable {
@NotNull
@Temporal(TemporalType.DATE)
private Date birthday;
@NotNull
@Size(min=3, max=15)
private String name;
//...
}
mio 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;}
}
Una qui la mia pagina JSF:
<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>
finalmente un frammento da 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>
Grazie per alcuni suggerimenti
ho notato un comportamento simile quando un ingresso è associato a un non-String con un convertitore, probabilmente dovuto alla stessa causa principale. Quando si inserisce una stringa vuota e la convalida non riesce a causa di un campo diverso, la stringa vuota (valida) viene sovrascritta con il valore dal bean. è stato segnalato come http://java.net/jira/browse/JAVASERVERFACES-838 – wrschneider
@BalusC: Grazie per la spiegazione dettagliata! Le tue soluzioni/spiegazioni qui spesso rendono la mia giornata ;-) –
@BalusC Significa che compila una versione personalizzata di JSF? Ho incontrato questo stesso problema e spero che questa non sia l'unica soluzione. – MikeR