J'ai un DataTable éditable pour l'entité Utilisateur. Cette table comporte un champ appelé nom d'utilisateur qui a une contrainte uniquePrimeFaces Datatable CellEditor - Différentes valeurs pour l'entrée et la sortie des facettes
<h:form id="form">
<p:dataTable id="userTable" value="#{users}" var="entity" editable="true" editMode="cell" tableStyle="width:auto">
<p:ajax event="cellEdit" listener="#{userController.onCellEdit}" update="form:msgs form:display form:userTable" />
<p:column headerText="UserID">
<p:outputLabel value="#{entity.id}" />
</p:column>
<p:column headerText="Username">
<p:cellEditor>
<f:facet name="output"><p:outputLabel for="username" value="#{entity.username}" /></f:facet>
<f:facet name="input">
<p:inputText id="username" value="#{entity.username}" >
<f:validateRequired />
<f:validateLength maximum="50" />
</p:inputText>
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</h:form>
Dans le UserController de haricot de support, je le procédé suivant onCellEdit
public void onCellEdit(CellEditEvent event) {
Object newValue = event.getNewValue();
String columnName = event.getColumn().getHeaderText();
facesContext = FacesContext.getCurrentInstance();
User entity = facesContext.getApplication().evaluateExpressionGet(facesContext, "#{entity}", User.class);
if(columnName.equals("Username") {
entity.setUsername((String) newValue);
}
try {
service.createOrUpdateEntity(entity);
}
catch (EJBTransactionRolledbackException ex) {
Throwable t = ex.getCause();
while (t != null) {
t = t.getCause();
if(t.getClass().getSimpleName().equals("SQLIntegrityConstraintViolationException")) {
entity.setUsername((String) event.getOldValue());
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Duplicate entry for the field username. Write a different username", ""));
break;
}
}
return;
}
catch (Exception e) {
e.printStackTrace();
}
Le problème est que, lorsque l'exception est attrapée la valeur finale car l'entrée de la facette est différente de la valeur de la sortie de la facette. Dans ce cas, la sortie de la facette affiche la bonne valeur tandis que l'entrée de la facette indique la valeur qui a produit l'exception.