Problemas com Filtro Primefaces + Passar objeto para o Bean

Tenho um datatable:

      <p:dataTable id="dtTipoDocumento"
							emptyMessage="Nenhum registro encontrado."
							value="#{tipodocumentoBean.listTipoDocumento}" var="t"
							style="text-align: center; font-size: 12px;" paginator="true"
							rows="10"
							paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
							rowsPerPageTemplate="10,20,50">

							<f:facet name="header">
								<h:outputText value="Registro de Tipo Documentos" />
							</f:facet>

							<p:column id="nomeColumn" filterBy="#{t.nome}"
								headerText="Filtrar por nome" filterMatchMode="contains">
								<f:facet name="header">
									<h:outputText value="Nome" />
								</f:facet>
								<h:outputText value="#{t.nome}" />
							</p:column>

							<p:column>
								<f:facet name="header">
									<h:outputText value="Ações" />
								</f:facet>
								<h:commandLink>
									<h:graphicImage title="Editar" url="images/edite.png"
										value="Editar" height="16px" width="16px" />
									<f:ajax event="click"
										listener="#{tipodocumentoBean.preparaEditar(t)}" update="@form" />
								</h:commandLink>
								<t></t>
								<p:commandLink actionListener="#{tipodocumentoBean.setUsuario(t)}"
									onclick="confirm.show()" immediate="true">
									<h:graphicImage value="images/delete.png" alt="Excluir"
										title="Excluir" style="border: none" height="16px"
										width="16px" />
								</p:commandLink>
							</p:column>

							<f:facet name="footer">
								<h:outputText
									value="Há um total de #{tipodocumentoBean.count} Tipo Documento(s) cadastrado(s) no sistema." />
							</f:facet>
						</p:dataTable>

O erro é o seguinte: Quando eu clico para Editar sem o Filtro, ele manda certo o objeto para o Bean e faz o que tem que fazer. Mas quando eu coloco algo no Filto do Primefaces o Botão Editar manda o objeto null para o Bean. Alguma sugestão ?

Já tentei com o:

Porém como o meu formulário está junto com o Datatable e possui campos obrigatórios, ao clicar no botão Editar, o evento de “Campo Obrigatório” é disparado, impedindo mandar o objeto para o Bean. :confused:

Eu acho que o problema é como o update do seu botão editar. Você deveria atualizar apenas o miolo do seu dialog de edição, e não o form inteiro.

Não é esse o problema, testei e nada. A questão é passar o objeto para o Bean quando tem o filtro. E não para renderizar. Do seu modo continua não passando o objeto pro bean quando tem o filtro. :confused:

Põe o código do bean pra gente. Qual o escopo dele?

@ManagedBean(name = "tipodocumentoBean")
@ViewScoped
public class TipoDocumentoBean {
	
	private TipoDocumento tipoDocumento = new TipoDocumento();
	private List<TipoDocumento> listTipoDocumento;
	private Long departamentoID;
	private Logger logger = Logger.getLogger(TipoDocumentoBean.class);
	
	public void gravar() throws Exception {
		TipoDocumentoDao tipoDocumentoDao = new TipoDocumentoDao(this.getManager());
		
		DepartamentoDao departamentoDao = new DepartamentoDao(this.getManager());
		Departamento departamento = new Departamento();
		logger.info("Recuperando valor do Departamento");
		departamento = (Departamento) departamentoDao.buscar(departamento, departamentoID);
		this.tipoDocumento.setDepartamento(departamento);
		
		if(this.tipoDocumento.getId_tipodoc() == null || this.tipoDocumento.getId_tipodoc() == 0) { //salvar
			this.tipoDocumento.setId_tipodoc(null);
			try {
				tipoDocumentoDao.salvar(this.tipoDocumento);
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", "Tipo documento: "+ this.tipoDocumento.getNome() +"salvo com sucesso."));
			} catch (Exception e) {
				logger.error(e);
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Ocorreu um erro interno", e.getCause().toString()));
				return;
			}
		}else{ //alterar
			try {
				tipoDocumentoDao.atualizar(this.tipoDocumento);
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", "Tipo documento: "+ this.tipoDocumento.getNome() +"alterado com sucesso."));
			} catch (Exception e) {
				logger.error(e);
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Ocorreu um erro interno", e.getCause().toString()));
				return;
			}
		}
		this.tipoDocumento = new TipoDocumento();
		this.listTipoDocumento = null;
		this.departamentoID = null;
	}
	
	public void excluir(TipoDocumento tipoDocumento) {
		TipoDocumentoDao tipoDocumentoDao = new TipoDocumentoDao(this.getManager());
		try {
			logger.info("Removendo tipo de documento ... ");
			tipoDocumentoDao.remover(this.tipoDocumento, this.tipoDocumento.getId_tipodoc());
			logger.info("Tipo de documento excluído com sucesso!");
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", "Tipo documento: "+ this.tipoDocumento.getNome() +"excluído com sucesso."));
		} catch (Exception e) {
			logger.error(e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Ocorreu um erro interno", e.getCause().toString()));
		}
		this.tipoDocumento = new TipoDocumento();
		this.listTipoDocumento = null;
		this.departamentoID = null;
	}

	public List<TipoDocumento> getListTipoDocumento() {
		if (this.listTipoDocumento == null) {
			TipoDocumentoDao tipoDocumentoDao = new TipoDocumentoDao(this.getManager());
			this.listTipoDocumento = tipoDocumentoDao.getTipoDocumentos();
		}
		return this.listTipoDocumento;
	}

	public Long getCount() {
		TipoDocumentoDao tipoDocumentoDao = new TipoDocumentoDao(this.getManager());
		if(this.listTipoDocumento != null){
			return (long) this.listTipoDocumento.size();
		}else {
			return tipoDocumentoDao.getCountTipoDocumentos();
		}
	}

	public String preparaEditar(TipoDocumento tipoDocumento) {
		this.setTipoDocumento(tipoDocumento);
		this.setDepartamentoID(this.getTipoDocumento().getDepartamento().getId_departamento());
		return "index?faces-redirect=true";
	}

	public TipoDocumento getTipoDocumento() {
		return tipoDocumento;
	}

	public void setTipoDocumento(TipoDocumento tipoDocumento) {
		this.tipoDocumento = tipoDocumento;
	}
	
	public Long getDepartamentoID() {
		return departamentoID;
	}

	public void setDepartamentoID(Long departamentoID) {
		this.departamentoID = departamentoID;
	}

	private EntityManager getManager() {
		FacesContext fc = FacesContext.getCurrentInstance();
		ExternalContext ec = fc.getExternalContext();
		HttpServletRequest request = (HttpServletRequest) ec.getRequest();
		return (EntityManager) request.getAttribute("entityManager");
	}
	
	public void limpar() {
		this.tipoDocumento = new TipoDocumento();
		this.departamentoID = null;
		this.listTipoDocumento = null;
	}
	
}

Ele manda para o método preparaEditar. Assim como visto acima… o escopo é ViewScoped. Tentei RequestScoped e SessionScoped e nada também. Por incrível que pareça tenho uma outra tela Usuário que implementa os mesmos métodos e também interface e funciona direitinho. Muito estranho isso :confused:

Ninguém ? :confused: