[RESOLVIDO] Auto complete com PrimeFaces 3.5

Boa noite senhores,

Venho pedir auxilio para essa problemática:

Estou fazendo um exercício da pós-graduação no qual estou utilizando JSF 2.1 + PRIMEFACES 3.5 + Hibernate 3 e quando eu uso o autocomplete do prime aparece o seguinte:

e lá vamos com os codigos:

Esse é o login.xhtml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
        xmlns:p="http://primefaces.org/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Login</title>
</h:head>
<h:body>
    <h:outputStylesheet library="css" name="estilo.css" />
    <div id="topo">
        Locadora de Veículos UNOPAR
    </div>
    
    <div id="centro">
    <h:form>
           <h3>Menu</h3>
            <p:menu>
                <p:submenu label="Usuário">
                    <p:menuitem value="Novo" action="#{usuarioBean.novo}" icon="ui-icon-disk" />
                    <p:menuitem value="Listar Usuários" action="#{usuarioBean.listarUsuarios}" icon="ui-icon-home" />
                </p:submenu>
                <p:submenu label="Tipo de Veículo">
                    <p:menuitem value="Novo" action="#{tipoDeVeiculoBean.novo}" icon="ui-icon-disk" />
                    <p:menuitem value="Listar Veículos" action="#{tipoDeVeiculoBean.listarTiposDeVeiculos}" icon="ui-icon-home" />
                </p:submenu>
                <p:submenu label="Veículo">
                    <p:menuitem value="Novo" action="#{veiculoBean.novo}" icon="ui-icon-disk" />
                    <p:menuitem value="Listar Veículos" action="#{veiculoBean.listarVeiculos}" icon="ui-icon-home" />
                </p:submenu>
                <p:submenu label="Pedido">
                    <p:menuitem value="Novo" action="#{pedidoBean.novo}" icon="ui-icon-disk" />
                    <p:menuitem value="Listar Pedidos" action="#{pedidoBean.listarPedidos}" icon="ui-icon-home" />
                </p:submenu>
                
            </p:menu>
            
            
    </h:form>
    </div>
    <div id="centro2">
        <p:panel header="Pesquisa">
            <p:panelGrid columns="2">
                <h:form>

                    <h3>Consulta</h3>
                    <h:outputLabel value="Placa:" for="placa" />  
                    <p:autoComplete value="#{veiculoBean.veiculo.placa}"
                                    id="placa" completeMethod="#{veiculoBean.complete}"
                                    var="placa" itemLabel="#{veiculo.placa}" itemValue="#{veiculoBean.veiculo.placa}"
                                    required="true" requiredMessage="Digite uma placa valida." rendered="true" >
                        <p:column>
                            #{placa}                            
                        </p:column>
                    </p:autoComplete><p:growl id="mes" for="placa" />
                    <p:spacer height="10" />
                    <p:commandButton value="Ver" update="mostra" ajax="false" />
                    <p:commandButton value="Limpar" action="#{veiculoBean.limpar}" />
                </h:form>
            </p:panelGrid>
            
        
            <p:spacer height="10" />
        
        
            <h:panelGroup id="mostra" rendered="#{not empty veiculo.placa}">
                <h2><h:outputText value="Você selecionou o carro:" /></h2>
                <h:panelGrid columns="2">
                    <h:outputLabel value="Carro:" />
                    <h:outputText value="#{veiculo.nome}" />
                    
                    <h:outputLabel value="Fabricante:" />
                    <h:outputText value="#{veiculo.fabricante}" />
                    
                    <h:outputLabel value="Placa:" />
                    <h:outputText value="#{veiculo.placa}" />
                </h:panelGrid>
            </h:panelGroup>
        </p:panel>
        
    </div>
</h:body>
</html>

VeiculoBean.java

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package br.com.locadora.web;

import br.com.locadora.veiculo.Veiculo;
import br.com.locadora.veiculo.VeiculoRN;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

/**
*

  • @author ThiagoBarso
    */

@ManagedBean(name=“veiculoBean”)
@RequestScoped
public class VeiculoBean {
private Veiculo veiculo = new Veiculo();
private List lista;

public String novo()
{
    this.veiculo = new Veiculo();
    return "veiculo";
}

public String salvar()
{

    VeiculoRN veiculoRN = new VeiculoRN();
    veiculoRN.salvar(this.veiculo);

    return "veiculoSucesso";
}

public Veiculo getVeiculo() {
    return veiculo;
}
public void setVeiculo(Veiculo veiculo) {
    this.veiculo = veiculo;
}

public List<Veiculo> getLista()
{
    if(this.lista == null)
    {
        VeiculoRN veiculoRN = new VeiculoRN();
        this.lista = veiculoRN.listar();
    }
    return this.lista;
}

public String editar(){
    return "/publico/veiculo";
}

public String login(){
    return "/publico/login";
}

public String listarVeiculos(){
    return "/publico/listarVeiculos";
}

public String excluir(){
    VeiculoRN veiculoRN = new VeiculoRN();
    veiculoRN.excluir(this.veiculo);
    this.lista = null;
    return "null";
}

public List<Veiculo> complete(String query) {  
    List<Veiculo> sugestoes = new ArrayList<Veiculo>();
    VeiculoRN veiculoRN = new VeiculoRN();
    List<Veiculo> results;
    results = veiculoRN.listar();
    for(Veiculo r : results){
        if(r.getPlaca().startsWith(query)){
            sugestoes.add(r);
        }
    }          
    return sugestoes;
    
} 

public String limpar(){
    this.veiculo = null;
    return "";
}

}[/code]

VeiculoConverter

[code]package br.com.locadora.web.filter.converter;

import br.com.locadora.veiculo.*;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

@FacesConverter(forClass=Veiculo.class)
public class VeiculoConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if(value != null && value.trim().length() > 0){
        Integer codigo = Integer.valueOf(value);
        try{
            VeiculoRN veiculoRN = new VeiculoRN();
            return veiculoRN.carregar(codigo);
        }catch(Exception e){
            throw new ConverterException("Não foi possivel carregar o veiculo "
                    + value + ". " + e.getMessage());
        }
    }
    return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if(value != null){
        Veiculo veiculo;
        veiculo = (Veiculo) value;
        return veiculo.getIdveiculo().toString();
    }
    return "";
}

}[/code]

O que pode estar dando errado?
Eu já tenho uma tela de cadastro de pedidos de veiculos que pega um converter para veiculo e usuário para usar no Managed Bean de pedido e está funcionando que é uma beleza.

Ola Thiago bom dia.

Cara eu não sou a pessoa ideal para ajudar ( tô começando … agora ) mais vou me atrever e espero ajudar.

como estão as suas entidades ?
vc sobrescreveu os metodos hashCode, equals e to toString? acredito que sim, mais acho que o problema pode estar neste ultimo metodo

abaixo vou deixar um código para vc verificar

	@Override
    public int hashCode() {
        int hash = 0;
        hash += (idEstado != null ? idEstado.hashCode() : 0);
        return hash;
    }	
	
    
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Estado)) {
            return false;
        }
        Estado other = (Estado) object;
        if ((this.idEstado == null && other.idEstado != null) || (this.idEstado != null && !this.idEstado.equals(other.idEstado))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return idEstado+"-"+dsEstado;
    }

Valeu! Obrigado, agora funcionou o auto-complete, mas ele não está selecionando.

:frowning:

Está até mostrando agora, porque fiz a alteração no método toString() da classe Veículo(POJO)

Mas porem quando eu clico ou dou um enter ele não funciona.
[color=red]Quando digo que nao funciona é porque quando eu clico na sugestão que
ele deu, o campo input fica como está, vazio.
[/color]

Obrigado pela dica.

Estou precisando de uma ajuda, esse trabalho é pra entregar hoje e só falta isso! :lol:

Bom galera, consegui resolver colocando um MB só para o auto complete como no exemplo do showcase do Prime!!! :D!

Valeu!

Tópico Resolvido!