0

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.

Répondre

1

Vous devez vous assurer que le composant UIInput a été réinitialisé aux valeurs d'origine. Le composant UIInput peut être récupéré à partir du CellEditEvent.

((UIInput)event.getComponent()).resetValue(); 

Ce qui précède suppose que vous avez vérifié le retour de getComponent() pour la sécurité nulle et le type. Voici l'API pour UIInput