Làm cách nào để bỏ qua xác thực Bean JSR-303 với JSF, khi một nút được nhấp?JSF 2.0: Làm cách nào để bỏ qua xác thực bean JSR-303?
Một cắn câu hỏi dài để giải thích một vài cách tiếp cận ... Hãy xem xét một danh sách trong một hình thức:
<h:form id="form">
<h:commandButton value="Add row">
<f:ajax execute="foo" listener="#{bean.add()}" render="foo" />
</h:commandButton>
<h:dataTable id="foo" var="foo" value="#{bean.foos}">
<h:column>
Name: <h:inputText id="field" value="#{foo.name}" required="true" />
<h:messages for="field" />
</h:column>
<h:column>
<h:commandButton value="Remove">
<f:ajax execute=":form:foo" listener="#{bean.remove(foo)}" render=":form:foo" />
</h:commandButton>
</h:column>
</h:dataTable>
</h:form>
Khi người dùng nhấp thêm hoặc xoá hàng, các hành động cần thực hiện mà không cần xác nhận. Vấn đề là, JSF làm lại toàn bộ danh sách và cố gắng xác nhận nó. Nếu có những thay đổi dự thảo không xác thực, lỗi xác thực xảy ra và phương pháp nghe không bao giờ được gọi (khi xác thực không thành công ngăn chặn điều đó). Tuy nhiên, thêm immediate="true"
vào f: ajax cho phép phương thức thực thi bất chấp lỗi xác thực. Tuy nhiên, lỗi xác thực vẫn xảy ra và được hiển thị ở đây.
tôi thấy hai lựa chọn:
1) Sử dụng ngay lập tức = "true" và không hiển thị lỗi xác nhận
Đối với không kiểm duyệt các nút, thiết lập ngay lập tức = "true" và cho h: thông điệp làm:
<h:messages rendered="#{param['SHOW_VALIDATION']}" />
Sau đó thiết lập Save-nút (mà thực sự nên cố gắng để lưu các hình thức) để gửi rằng tham số:
<h:commandButton>
<f:param name="SHOW_VALIDATION" value="true" />
</h:commandButton>
Điều này làm cho xác thực xảy ra, nhưng thông điệp chỉ đơn giản là không được hiển thị trừ khi có thông số SHOW_VALIDATION
.
2) Khai báo xác nhận trong Facelets có điều kiện:
<h:inputText>
<f:validateRequired disabled="#{!param['VALIDATE']}" />
</h:inputText>
Và Lưu-button:
<h:commandButton>
<f:param name="VALIDATE" value="true" />
</h:commandButton>
Điều này làm cho các lĩnh vực để xác nhận chỉ khi tham số VALIDATE
hiện diện (= khi Save-button đã được nhấn).
Nhưng những thứ này có vẻ như là một hacks. Làm cách nào tôi có thể sử dụng Xác thực Bean JSR-303 nhưng bỏ qua khi được khai báo?
Vâng, tôi đã không thử bất kỳ giải pháp xác thực nào khác ngoài JSR-303 và các facelet với JSF. Tôi nghĩ vấn đề này liên quan đến JSF chứ không phải lỗi của JSF-303 - giống như là họ đã quên hỗ trợ "nguyên bản" bỏ qua xác thực trong JSF. Dường như có rất nhiều sự nhầm lẫn xung quanh ... –