Nie rozumiem zachowania JSF2 podczas valdation. Mam nadzieję, że ktoś może mi pomóc.JSF 2 - Bean Validation: sprawdzanie poprawności nie powiodło się -> puste wartości są zastępowane ostatnimi prawidłowymi wartościami z zarządzanego komponentu bean
Mam formularza gdzie pola są sprawdzane po (Ajax) złożyć - ok
Jeśli sprawdzanie poprawności powiodło się komunikat o błędzie jest wyświetlany - ok
Na moim przykładzie, kiedy podać poprawny urodziny i pole nazwa jest pusta errormessage dla nazwa jest wyświetlana po przesłaniu.
Teraz, kiedy podać poprawny nazwę i usuń wejście z dziedzinie urodziny ErrorMessage jest pokazać urodzin (to jest ok), ale teraz stara „ważny” urodziny także stoi w polu tekstowym! ?!
Jak mogę uniknąć tego zachowania? Kiedy złożyć puste pole Chcę zobaczyć ErrorMessage i pustego pola ...
Oto mój przykładowy kod:
używam ManagedBean (TestBean), który zawiera EntityBean (nas). Kontakt zawiera zatwierdzenia na anonimizacji.
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;}
}
tutaj moja strona 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>
na ostatni fragment z 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>
Dziękujemy za porady
Zauważyłem podobne zachowanie, gdy dane wejściowe są powiązane z właściwością inną niż String z konwerterem, prawdopodobnie z tej samej przyczyny źródłowej. Gdy wstawisz pusty łańcuch, a sprawdzanie poprawności nie powiedzie się z powodu innego pola, Twój (prawidłowy) pusty łańcuch zostanie zastąpiony wartością z komponentu bean. Został zgłoszony jako http://java.net/jira/browse/JAVASERVERFACES-838 – wrschneider
@BalusC: Dziękujemy za szczegółowe wyjaśnienie! Twoje rozwiązania/wyjaśnienia tutaj często sprawiają, że mój dzień ;-) –
@BalusC Czy to oznacza, że kompiluje niestandardową wersję JSF? Napotkałem ten sam problem i mam nadzieję, że nie jest to jedyne rozwiązanie. – MikeR