2
respostas

Autocomplete do Primefaces

Olá, boa noite a todos. Preciso da ajuda de vocês, estou tentando implementar um autocomplete, que na teoria deveria ser simples, porém, estou só multiplicando a quantidade de fios brancos em minha cabeça.

Segue o trecho de código:

<p:autoComplete id="produto" size="40"
    value="#{pedidoController.produtoPedido.produto}"
    completeMethod="#{pedidoController.buscaProdutos}"
    var="produto" itemLabel="#{produto}" itemValue="#{produto}"
    converter="produtoConverter">
    <p:ajax event="blur"
    listener="#{pedidoController.calcularSubtotal()}" />
</p:autoComplete>

A questão é que o método do meu managedBean simplesmente não é acionado! E mais, depois de muitas tentativas, olhando a documentação do Prime, etc.. etc.. etc.. eu retirei o 'var', 'itemLabel', 'itemValue' e 'converter' , deixando apenas o 'value' e o 'completeMethod' do componente, assim como um exemplo dado na documentação. Feito isto, O COMPONENTE FUNCIONA!!!!!!!

O que é? É algo tão trivial e eu não consigo encontrar a solução disso em CANTO ALGUM. Por favor, me ajudem...

2 respostas

Apenas complementando... o componente funciona no sentido de buscar registros do banco, etc... O QUE NÃO FUNCIONA é o blurEvent

Me ajudem aí, pessoal que é mais experiente e ADMs da Alura. Please!!!!!

Bom dia Wh Desenv, Fiz alguns testes aqui e acredito que o seu problema seja que o objeto ProdutoPedido não está sendo inicializado. Experimente inicializar a ProdutoPedido com 'new ProdutoPedido()'. Irei deixar abaixo o código que utilizei para testar. Simulei como se fosse uma pesquisa no banco de dados. Sugiro que utilize 'change' ao invés de 'blur', acredito ser mais eficaz para a proposta da funcionalidade, já que com blur você entrará no método calcularSubtotal duas vezes. Att.

--- HTML---
<h:body>
    <h:form id="frm">
        <p:messages />
        <p:panelGrid columns="2">
            <p:outputLabel value="Pesquisa produto:" for="produto" />
            <p:autoComplete id="produto" size="40"
                           value="#{pedidoController.produtoPedido.produto}"
                        completeMethod="#{pedidoController.buscaProdutos}"
                        var="produto" itemLabel="#{produto.descricao}" itemValue="#{produto}"
                        converter="produtoConverter">
                    <p:ajax event="change" listener="#{pedidoController.calcularSubtotal()}" />
            </p:autoComplete>

        </p:panelGrid>
    </h:form>
</h:body>

--- Bean ---
@ManagedBean
@ViewScoped
public class PedidoController implements Serializable {

    private static final long serialVersionUID = 1L;

    private ProdutoPedido produtoPedido = new ProdutoPedido();

    public List<Produto> buscaProdutos(String descricao) {
        return getProdutosPelaDescricao(descricao);
    }

    private List<Produto> getProdutosPelaDescricao(String descricao) {
        List<Produto> produtos = Arrays.asList(new Produto(1, "camisa", 10), new Produto(2, "short", 20), new Produto(3, "livro", 30));
        return produtos.stream().filter(p -> p.getDescricao().contains(descricao)).collect(Collectors.toList());
    }

    public void calcularSubtotal() {
        System.out.println("Entrou no método calculaSubTotal");
        if (produtoPedido.getProduto() != null) {
            System.out.println(produtoPedido.getProduto().getDescricao());
        }
    }

    public ProdutoPedido getProdutoPedido() {
        return produtoPedido;
    }

    public void setProdutoPedido(ProdutoPedido produtoPedido) {
        this.produtoPedido = produtoPedido;
    }

}

--- Classe Produto ---
public class Produto {

    private long id;
    private String descricao;
    private int valor;

    public Produto() {
    }

    public Produto(long id, String descricao, int valor) {
        this.id = id;
        this.descricao = descricao;
        this.valor = valor;
    }

    public long getId() {
        return id;
    }

    public String getDescricao() {
        return descricao;
    }

    public int getValor() {
        return valor;
    }

}

--- Conversor ---
@FacesConverter("produtoConverter")
public class ProdutoConverter implements Converter {

    // Simula Banco de dados
    private List<Produto> produtos = Arrays.asList(new Produto(1, "camisa", 10), new Produto(2, "short", 20), new Produto(3, "livro", 30));

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Optional<Produto> produto = null;
        if (value != null && !value.isEmpty()) {
            produto = produtos.stream().filter(p -> p.getDescricao().contains(value)).findFirst();
        }
        return produto.orElse(new Produto());
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return String.valueOf(((Produto) value).getId());
    }

}

--- ProdutoPedido
public class ProdutoPedido {

    private Produto produto;

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

}