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 한 것을 제외하고는 최종 값을 사로 잡았 때 패싯 입력이 패싯 출력의 값과 다릅니다. 이 경우 패싯 출력은 올바른 값을 표시하는 반면 패싯 입력은 예외를 생성 한 값을 표시합니다.