0

엔티티 사용자에 대해 편집 가능한 DataTable이 있습니다. 이 표는 백업 빈 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> 

이있는 필드라는 이름을 가지고, 나는 다음과 같은 방법

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(); 
     } 

문제가 onCellEdit 한 것을 제외하고는 최종 값을 사로 잡았 때 패싯 입력이 패싯 출력의 값과 다릅니다. 이 경우 패싯 출력은 올바른 값을 표시하는 반면 패싯 입력은 예외를 생성 한 값을 표시합니다.

답변

1

UIInput 구성 요소가 원래 값으로 재설정되었는지 확인해야합니다. UIInput 구성 요소는 CellEditEvent에서 검색 할 수 있습니다.

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

위는 널 입력 안전을 위해 getComponent()의 반환을 확인했다고 가정합니다. UIInput

에 대한 API는 다음과 같습니다.