P:autocomplete funciona mas não altera Managed Bean

Estou usando Primefaces 7.0 e tendo problemas com o autocomplete. Ao executar o código abaixo, o autocomplete exibe a lista de sugestões, escolho a opção desejada, mas não executa o value, nem o listener e nem o converter, deixando o valor como null para a sequência da execução. Onde estou errando?

  • XHTML
<p:autoComplete id="entrevistador" value="#{domicilioMB.entrevistador}" dropdown="true" widgetVar="widgetEntr"
			completeMethod="#{entrevistadorMB.autoComplete}" var="entr" itemValue="#{entr}" itemLabel="#{entr.nome}"
			converter="#{entrevistadorConverter}"
			scrollHeight="100" minQueryLength="3" cache="true" cacheTimeout="5000"
			forceSelection="true" alt="-- Selecione um entrevistador --" emptyMessage="Texto não encontrado!">
	<p:ajax event="change" listener="#{domicilioMB.handleSelectEntrevistador}" process="@form" onstart="if(PF('widgetEntr').panel.is(':visible')) return false;" />
	<p:ajax event="itemSelect" listener="#{domicilioMB.handleSelectEntrevistador}" process="@form" onstart="if(PF('widgetEntr').panel.is(':visible')) return false;" />
</p:autoComplete>
  • ManagedBean
	public List<Entrevistador> autoComplete(String texto) {
		List<Entrevistador> entrevistadores = new ArrayList<Entrevistador>();
		try{
			entrevistadores = entrevistadorFacade.autoComplete(texto);
			return entrevistadores;
		} catch (DAOException daoe) {
			JSFHelper.addGlobalMessage(FacesMessage.SEVERITY_ERROR, daoe.getMessage());
			daoe.printStackTrace();
			return null;
		}
    }
	public void handleSelectEntrevistador(AjaxBehaviorEvent event) {
		this.entrevistador = (Entrevistador)event.getSource();
	}
	public void handleSelectEntrevistador(SelectEvent event) {
		this.entrevistador = (Entrevistador)event.getObject();
	}
  • Converter
@FacesConverter("entrevistadorConverter")
public class EntrevistadorConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent ui, String value) throws ConverterException {
		if (value != null && !value.isEmpty()) {
            return (Entrevistador)ui.getAttributes().get(value);
        }
        return null;
	}

	@Override
	public String getAsString(FacesContext context, UIComponent ui, Object value) throws ConverterException {
            if (entity != null && entity instanceof Entrevistador && entity.getId() != 0) {
                ui.getAttributes().put( entity.getNome(), entity);
                return entity.getNome();
            }
        }
        return "";
	}
}

Você chegou a debugar para ver se os métodos do converter estão sendo chamados?

o value do getAsObject acho que retorna o ID como String
recupero o objeto pelo ID e consigo pegar o Objeto

@FacesConverter("clienteConverter")

public class clienteConverter implements Converter {
//usado para realizar a consulta
@Autowired
private ClienteServico clienteServico;

public clienteConverter() {
	FacesContext context = FacesContext.getCurrentInstance();
	clienteServico = (ClienteServico) context.getELContext().getELResolver()
			.getValue(context.getELContext(), null, "clienteServico");
}

@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
	System.out.println("valor cliente aqui ___________________________________"+value);		
	
	if(value == null || value.trim().equals("") || value.trim().replaceAll("[^0-9]*", "").equals("") ){
		return null;
	}else{
            try {	            	
            	Cliente cliente = clienteServico.recuperaClienteID(Long.parseLong(value));
                return cliente;
            } catch(NumberFormatException e) {	               
            }
        }       
        return null;
}

@Override
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
	Cliente cliente = (Cliente) object;
	
    if(cliente == null || cliente.getId() == null) {        	
    	 return null;
    }
    else {
    	 System.out.println("cliente  pesquisando 2 ++++++++++++++++"+cliente.getNome());         	
         return String.valueOf(((Cliente) object).getId());
    }
}

}

Funciona comigo!

Sim, Matheus, debuguei, e o debug não entra nem no Converter nem nos métodos marcados pelos dois p:ajax .

@viniciusfip, apesar de ver em vários posts, li em algum dos posts que pesquisei que não é uma boa prática um converter ter que fazer acesso a disco pra obter um objeto (que seja pelo id), e pra mim faz sentido, pois o objeto já está na tela, ele já foi trazido dentro de alguma coleção (no meu caso, a coleção que o DAO buscou pra montar a lista do autocomplete). E como disse, pelo debug vi que o método getAsObject não está sendo chamado…