0

エンティティユーザーに対して編集可能なDataTableがあります。このテーブルには、バッキングBean UserControllerではPrimeFaces Datatable CellEditor - ファセット入出力の値が異なります

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

ユニーク制約を持つユーザ名と呼ばれるフィールドを持って、私はこの問題は、例外が最終値をcatchedされている場合ということです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(); 
     } 

次のメソッドを持っていますファセット入力の値はファセット出力の値とは異なります。この場合、ファセット出力は正しい値を示し、ファセット入力は例外を生成した値を示します。

答えて

1

UIInputコンポーネントが元の値にリセットされていることを確認する必要があります。 UIInputコンポーネントはCellEditEventから取得できます。

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

上記あなたがnullと型の安全性のためのgetComponent()からの復帰をチェックしたことを想定しています。 UIInputのAPIは

です
関連する問題