Jak pominąć sprawdzanie fasoli JSR-303 za pomocą JSF, po kliknięciu przycisku?JSF 2.0: Jak pominąć sprawdzanie fasoli JSR-303?
Trochę długie pytanie wyjaśnić kilka podejść ... Rozważmy listę w formie:
<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>
Kiedy użytkownik kliknie dodać lub usunąć wiersz, czynność powinien wykonać bez walidacji. Problem polega na tym, że JSF ponownie renderuje całą listę i próbuje ją zweryfikować. Jeśli istnieją zmiany wersji roboczej, które nie są sprawdzane, występują błędy sprawdzania poprawności i metoda detektora nigdy nie jest wywoływana (ponieważ walidacja zakończona niepowodzeniem uniemożliwia to). Jednak dodanie do f: ajax wartości immediate="true"
pozwala na wykonanie metody pomimo błędów sprawdzania poprawności. Jednak błędy sprawdzania poprawności nadal występują i są tutaj wyświetlane.
widzę dwie opcje:
1) stosowanie natychmiastowe = "true" i nie wykazują błędy sprawdzania poprawności
Dla niewalidujący przycisków, ustawić natychmiastowy = "true", a dla h: Komunikaty zrobić:
<h:messages rendered="#{param['SHOW_VALIDATION']}" />
Następnie ustaw przycisk Zapisz (które powinny faktycznie spróbuj zapisać formularz), aby wysłać ten parametr:
<h:commandButton>
<f:param name="SHOW_VALIDATION" value="true" />
</h:commandButton>
Powoduje to sprawdzenie poprawności, ale komunikaty nie są wyświetlane, chyba że obecny jest parametr SHOW_VALIDATION
.
2) Stwierdzenie poprawności w Facelets warunkowo:
<h:inputText>
<f:validateRequired disabled="#{!param['VALIDATE']}" />
</h:inputText>
i SAVE-button:
<h:commandButton>
<f:param name="VALIDATE" value="true" />
</h:commandButton>
Powoduje to pola do sprawdzania poprawności tylko wtedy, gdy parametr VALIDATE
jest obecny (= kiedy Zapisz przycisk został wciśnięty).
Ale te wydają się być hackami. W jaki sposób mogę po prostu użyć JAND-303 Bean Validation, ale pominąć go, gdy zostanie zadeklarowany?
Cóż, nie próbowałem żadnych innych rozwiązań sprawdzających poprawność niż JSR-303 i facelets z JSF. Myślę, że ten problem jest związany z JSF, a nie z JSF-303 - tak jakby zapomnieli "natywnie" obsługiwać pomijanie sprawdzania poprawności w JSF. Wydaje się, że jest w tym dużo zamieszania ... –