Tôi không hiểu hành vi của JSF2 trong quá trình valdation. Hy vọng ai đó có thể giúp tôi.JSF 2 - Xác thực Bean: xác nhận không thành công -> giá trị rỗng được thay thế bằng giá trị hợp lệ cuối cùng từ bean được quản lý
Tôi có một hình thức mà các lĩnh vực được xác nhận sau (ajax) nộp - ok
Nếu xác nhận thất bại trong một thông báo lỗi được hiển thị - ok
Ví dụ của tôi khi tôi bước vào một ngày sinh hợp lệ và trường tên trống rỗng cho tên được hiển thị sau khi gửi.
Bây giờ khi tôi nhập vào một giá trị tên và xóa các đầu vào từ sinh nhật lĩnh vực một errormessage được hiển thị cho sinh nhật (đó là ok) nhưng bây giờ sinh nhật 'hợp lệ' cũ cũng đứng trong lĩnh vực đầu vào! ?!
Làm cách nào để tránh hành vi này? Khi tôi gửi một cánh đồng trống Tôi muốn nhìn thấy một errormessage và một cánh đồng trống ...
Dưới đây là mẫu mã của tôi:
tôi sử dụng một ManagedBean (TestBean) có chứa một EntityBean (Liên). Số Liên hệ chứa các xác thực cho mỗi lần hủy.
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;}
}
Một ở đây trang JSF của tôi:
<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>
cuối cùng một đoạn từ 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>
Cảm ơn một số mẹo
Tôi đã nhận thấy hành vi tương tự khi đầu vào bị ràng buộc vào thuộc tính không phải Chuỗi với trình chuyển đổi, có thể do cùng nguyên nhân gốc. Khi bạn đặt vào một chuỗi rỗng và xác thực không thành công do một trường khác, chuỗi rỗng (hợp lệ) của bạn bị ghi đè bằng giá trị từ bean. Đã được báo cáo là http://java.net/jira/browse/JAVASERVERFACES-838 – wrschneider
@BalusC: Cảm ơn bạn đã giải thích chi tiết! Giải pháp của bạn/giải thích ở đây thường làm cho ngày của tôi ;-) –
@ BalusC Điều đó có nghĩa là ông biên dịch một phiên bản tùy chỉnh của JSF? Tôi đã gặp phải vấn đề tương tự và hy vọng rằng đây không phải là giải pháp duy nhất. – MikeR