0

Ich habe eine bearbeitbare DataTable für die Entität Benutzer. Diese Tabelle ein Feld namens Benutzername hat, diePrimeFaces Datatable CellEditor - Verschiedene Werte für Facetteneingabe und -ausgabe

<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> 

in dem Träger bean Usercontroller eine eindeutige Einschränkung hat, habe ich folgendes Verfahren 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(); 
     } 

Das Problem ist, dass, wenn die Ausnahme ist die Endwert catched für die Facetteneingabe unterscheidet sich von dem Wert von der Facettenausgabe. In diesem Fall zeigt die Facettenausgabe den richtigen Wert, während die Facetteneingabe den Wert anzeigt, der die Ausnahme erzeugt hat.

Antwort

1

Sie müssen sicherstellen, dass die UIInput-Komponente auf die ursprünglichen Werte zurückgesetzt wurde. Die UIInput-Komponente kann von CellEditEvent abgerufen werden.

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

Die oben geht davon aus, dass Sie die Rückkehr von getComponent() für null und Typsicherheit überprüft haben. Hier ist die API für UIInput

Verwandte Themen