Come saltare la convalida del bean JSR-303 con JSF, quando si fa clic su un pulsante?JSF 2.0: come saltare la convalida del bean JSR-303?
Una lunga questione po 'di spiegare alcuni approcci ... Si consideri una lista in una forma:
<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>
Quando l'utente fa clic aggiungere o rimuovere fila, l'azione deve essere avviata senza convalida. Il problema è che JSF ridisegna l'intera lista e prova a convalidarla. Se ci sono bozze di modifiche che non si verificano, si verificano errori di convalida e il metodo listener non viene mai chiamato (poiché la convalida non riuscita lo impedisce). Tuttavia, aggiungendo immediate="true"
in f: ajax consente l'esecuzione del metodo nonostante gli errori di convalida. Tuttavia, gli errori di convalida si verificano ancora e sono mostrati qui.
vedo due opzioni:
1) l'uso immediato = "true" e non mostrano errori di validazione
Per non-validante pulsanti, impostare immediata = "true" e per h: i messaggi fanno:
<h:messages rendered="#{param['SHOW_VALIDATION']}" />
Poi il set salva-tasto (che dovrebbe in realtà cercare di salvare il modulo) per inviare quel parametro:
<h:commandButton>
<f:param name="SHOW_VALIDATION" value="true" />
</h:commandButton>
Ciò provoca la convalida, ma i messaggi semplicemente non vengono visualizzati tranne quando è presente il parametro SHOW_VALIDATION
.
2) dichiarare la convalida in facelets condizionalmente:
<h:inputText>
<f:validateRequired disabled="#{!param['VALIDATE']}" />
</h:inputText>
e salva-pulsante:
<h:commandButton>
<f:param name="VALIDATE" value="true" />
</h:commandButton>
Questo fa sì che i campi di convalidare solo quando il parametro VALIDATE
è presente (= quando il pulsante Save è stato premuto).
Ma questi sembrano una specie di hack. Come posso semplicemente usare JSR-303 Bean Validation ma saltarlo quando dichiarato?
Bene, non ho provato altre soluzioni di convalida di JSR-303 e facelets con JSF. Penso che questo problema sia relativo a JSF e non alla colpa di JSF-303 - è come se si dimenticassero di supportare "nativamente" la salta della convalida in JSF. Sembra che ci sia molta confusione intorno a questo ... –