[RESOLVIDO] Auto complete com PrimeFaces 3.5

3 respostas
thiagobarso

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:

[img]http://img580.imageshack.us/img580/9261/erroautocomplete.png[/img]

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
/*
 * 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<Veiculo> 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 "";
    }
    
}

VeiculoConverter

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 "";
    }
    
}

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.

3 Respostas

R

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;
    }
thiagobarso

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:

thiagobarso

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

Valeu!

Tópico Resolvido!

Criado 23 de fevereiro de 2013
Ultima resposta 26 de fev. de 2013
Respostas 3
Participantes 2