Je ne comprends pas le comportement de JSF2 pendant la valdation. J'espère que quelqu'un peut m'aider.JSF 2 - Validation du bean: échec de la validation -> les valeurs vides sont remplacées par les dernières valeurs valides du bean géré
J'ai une forme où les champs sont validés après (ajax) soumettre - ok
Si la validation a échoué un message d'erreur est affiché - ok
Pour mon exemple quand j'entre un valide anniversaire et champ nom est vide un message d'erreur pour nom est affiché après soumettre.
Maintenant, quand j'entrer un nom valide et supprimer l'entrée du champ d'anniversaire un errormessage est spectacle pour anniversaire (c'est ok) mais maintenant l'ancien « valide » anniversaire se distingue également dans le champ de saisie! ?!
Comment puis-je éviter ce comportement? Quand je soumets un champ vide Je veux voir un errormessage et un champ vide ...
Voici mon exemple de code:
J'utilise un ManagedBean (TestBean) qui contient un EntityBean (Contacter). Le Contact contient des validations par annotation.
public class Contact implements Serializable {
@NotNull
@Temporal(TemporalType.DATE)
private Date birthday;
@NotNull
@Size(min=3, max=15)
private String name;
//...
}
Mon 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;}
}
Une ici ma page 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>
enfin un extrait de 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>
Merci pour quelques conseils
J'ai remarqué un comportement similaire lorsqu'une entrée est liée à une propriété non-String avec un convertisseur, probablement en raison de la même cause. Lorsque vous insérez une chaîne vide et que la validation échoue en raison d'un champ différent, votre chaîne vide (valide) est remplacée par la valeur du bean. A été signalé comme http://java.net/jira/browse/JAVASERVERFACES-838 – wrschneider
@BalusC: Merci pour votre explication détaillée! Vos solutions/explications ici font souvent ma journée ;-) –
@BalusC Cela signifie-t-il qu'il compile une version personnalisée de JSF? J'ai rencontré ce même problème et j'espère que ce n'est pas la seule solution. – MikeR