我使用primefaces dataTable和rowEdit事件来更改和保存dataTable中的值。当我编辑未经过滤的行值时,它运行良好,但是当我过滤值并尝试编辑时,会编辑错误的ID。
例如: 我有一个包含5条记录的列表,其中包含1到5的ID。
我过滤列表以显示id = 5的记录,因此它只显示一行。 当我尝试编辑这条记录时,我的bean正确获取了值,但是在我应用过滤器之前,对象的id而不是5,它是1,它位于数据表的第一行。 如果我编辑过滤表的第二行,它将获得没有过滤器的原始数据表的第二行的id。
屏幕:
<p:dataTable id="dataTable" var="linha" rowKey="#{linha.id}"
value="#{gestor.listaGestor}" editable="true"
draggableColumns="true"
rendered="#{not empty gestor.listaGestor}"
widgetVar="tableGestor" filteredValue="#{gestor.filteredGestor}"
emptyMessage="Não existem registros." resizableColumns="true" styleClass="datatable_cadastro" liveResize="true">
<f:facet name="header">
Tabela Gestores
<p:commandButton id="toggler" type="button" value="Colunas" />
<p:columnToggler datasource="dataTable" trigger="toggler" />
</f:facet>
<p:ajax event="rowEdit" listener="#{gestor.onRowEdit}"
update=":edicao:msgs,:edicao:dataTable" />
<p:ajax event="rowEditCancel" listener="#{gestor.onRowCancel}"
update=":edicao:msgs" />
<p:column headerText="ID" sortBy="#{linha.id}" filterBy="#{linha.id}"
style="width:50px;">
<p:outputLabel value="#{linha.id}" style="width:100%" />
</p:column>
<p:column headerText="NOME" filterBy="#{linha.nome}"
filterMatchMode="contains" sortBy="#{linha.nome}"
style="width:100%;">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{linha.nome.trim()}" />
</f:facet>
<f:facet name="input">
<p:inputTextarea value="#{linha.nome}" id="nome"
update=":edicao" style="width:100%" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="E-MAIL"
style="width:100%;" sortBy="#{linha.email}"
filterBy="#{linha.email}" filterMatchMode="contains">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{linha.email.trim()}" />
</f:facet>
<f:facet name="input">
<p:inputTextarea value="#{linha.email}" id="email"
update=":edicao" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="ATIVO" style="width:150px;" filterBy="#{linha.ativo}" filterMatchMode="equals">
<f:facet name="filter">
<p:selectOneMenu onchange="PF('tableGestor').filter()" >
<f:converter converterId="javax.faces.Character"/>
<f:selectItem itemLabel="TODOS" itemValue=""/>
<f:selectItem itemLabel="ATIVO" itemValue="T"/>
<f:selectItem itemLabel="INATIVO" itemValue="F"/>
</p:selectOneMenu>
</f:facet>
<p:cellEditor>
<f:facet name="output">
<p:selectBooleanCheckbox value="#{gestor.charToBool(linha.ativo)}" disabled="true"/>
</f:facet>
<f:facet name="input">
<p:selectBooleanCheckbox value="#{gestor.ativo}" id="ativo" immediate="true" update=":edicao" style="width:100%;"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="!" style="width:40px">
<p:rowEditor/>
</p:column>
<p:column headerText="X" style="width:40px">
<p:commandLink styleClass="ui-icon ui-icon-trash"
action="#{gestor.deletar(linha)}" update=":edicao" />
</p:column>
</p:dataTable>
豆(onRowEdit):
public void onRowEdit(RowEditEvent event){
Object value = event.getObject();
GestorVO gestorTela = (GestorVO) value;
SimpleDateFormat dataHora = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
FacesContext context = FacesContext.getCurrentInstance();
if(gestorTela.getId() != null){
if(ativo){
gestorTela.setAtivo('T');
} else {
gestorTela.setAtivo('F');
}
GestorRN gestorRN = new GestorRN();
GestorVO gestorAntes = gestorRN.getByPrimaryKey(gestorTela.getId());
/** CONSISTENCIA DOS CAMPOS */
/** IF CASO O CONTEUDO DOS CAMPOS SEJA NULO */
if (gestorTela.getNome().trim().isEmpty() || gestorTela.getEmail().trim().isEmpty() ) {
gestorTela.setNome(gestorAntes.getNome());
gestorTela.setEmail(gestorAntes.getEmail());
gestorTela.setAtivo(gestorAntes.getAtivo());
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Alteração foi cancelada" ,"Nenhum campo pode estar vazio ou conter apenas espaço(s)." ));
} else {
/** IF CASO O CONTEUDO FOI SALVO MAS NÃO HOUVERAM ALTERAÇÕES NO REGISTRO */
if (gestorAntes.getNome().trim().equals(gestorTela.getNome().trim())
&& gestorAntes.getEmail().trim().equals(gestorTela.getEmail().trim())
&& gestorAntes.getAtivo() == gestorTela.getAtivo() ) {
gestorTela.setNome(gestorAntes.getNome());
gestorTela.setEmail(gestorAntes.getEmail());
gestorTela.setAtivo(gestorAntes.getAtivo());
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Alteração foi cancelada" ,"Não houve alteração no registro" ));
}
/** CASO O CONTEUDO TENHA SIDO REALMENTE ALTERADO, SALVA O CONTEUDO */
else{
/** Realiza o trim para limpeza dos campos antes da gravação*/
gestorTela.setNome(gestorTela.getNome().trim());
gestorTela.setEmail(gestorTela.getEmail().trim());
gestorTela.setUsuarioAlteracao(loginRN.usuarioLogado().getNome());
gestorTela.setDataAlteracao(dataHora.format(new Date()));
/** Caso ocorra erros no método salvar, a tela retornará para os valores padrões antes da alteração */
boolean confirmacao = gestorRN.salvar(gestorTela);
if(!confirmacao) {
gestorTela.setNome(gestorAntes.getNome());
gestorTela.setEmail(gestorAntes.getEmail());
gestorTela.setAtivo(gestorAntes.getAtivo());
}
}
}
} else {
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "ID do objeto Gestor não identificado" ,"Não foi possível identificar o ID do Gestor selecionado. Informe o ocorrido ao administrador do sistema" ));
}
}
答案 0 :(得分:0)
当我使用@requestScoped bean时发生了这种情况。我切换到@ViewScoped,它工作正常。