Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

erro ao acessar a tela de Vendas. - Aula 8 JSFII

Ao tentar acessar a tela de vendas, onde é exibido o gráfico, ele dá o erro abaixo:

nov 14, 2017 12:33:14 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
SEVERE: Error Rendering View[/vendas.xhtml]
javax.el.ELException: /vendas.xhtml @17,82 model="#{vendasBean.vendasModel}": Error reading 'vendasModel' on type br.com.caelum.livraria.bean.VendasBean
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at org.primefaces.component.chart.Chart.getModel(Chart.java:104)
    at org.primefaces.component.chart.renderer.BarRenderer.encodeData(BarRenderer.java:33)
    at org.primefaces.component.chart.renderer.BasePlotRenderer.render(BasePlotRenderer.java:29)
    at org.primefaces.component.chart.ChartRenderer.encodeScript(ChartRenderer.java:98)

Eu consegui fazer funcionar com o exemplo do PrimeFaces. Essa é a minha classe VendasBeans.java

package br.com.caelum.livraria.bean;
import java.util.ArrayList;
import java.util.Random;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.chart.BarChartModel;
import org.primefaces.model.chart.ChartSeries;
import antlr.collections.List;
import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Livro;
import br.com.caelum.livraria.modelo.Venda;

@ManagedBean
@ViewScoped
public class VendasBean {
    public BarChartModel getVendasModel() {
        BarChartModel model = new BarChartModel();
        ChartSeries vendaSerie = new ChartSeries();
        vendaSerie.setLabel("Vendas 2016");
        List<Venda> vendas = getVendas(1234);
        for (Venda venda : vendas) {
            vendaSerie.set(venda.getLivro().getTitulo(), venda.getQuantidade());
        }
        model.addSeries(vendaSerie);
        ChartSeries vendaSerie2015 = new ChartSeries();
        vendaSerie2015.setLabel("Vendas 2015");
        vendas = getVendas(4321);
        for (Venda venda : vendas) {
            vendaSerie2015.set(venda.getLivro().getTitulo(),
                    venda.getQuantidade());
        }
        model.addSeries(vendaSerie2015);
        return model;
    }
    public List<Venda> getVendas(long seed) {
        List<Livro> livros = new DAO<Livro>(Livro.class).listaTodos();
        List<Venda> vendas = new ArrayList<Venda>();
        Random random = new Random(seed);
        for (Livro livro : livros) {
            Integer quantidade = random.nextInt(500);
            vendas.add(new Venda(livro, quantidade));
        }
        return vendas;
    }
}

Pelo pouco que eu entendi, falta o getVendas(), porém não é criado um getVendas() no vídeo.

6 respostas

Olá fabio, tudo bem?

vc poderia passar o código da sua view também?

vendas.xhtml

<?xml version="1.0" encoding="UTF-8" ?>
<!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://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui" 
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

    <ui:composition template="_template.xhtml">

        <ui:define name="titulo">
                <p:outputPanel>Vendas</p:outputPanel>
        </ui:define>

        <ui:define name="conteudo">
             <p:chart type="bar" model="#{vendasBean.vendasModel}" style="height:300px" />
        </ui:define>

    </ui:composition>

</html>

e o Venda.java

package br.com.caelum.livraria.modelo;

public class Venda {

    private Livro livro;
    private Integer quantidade;

    public Venda(Livro livro, Integer quantidade) {
        this.livro = livro;
        this.quantidade = quantidade;
    }

    public Livro getLivro() {
        return livro;
    }
    public void setLivro(Livro livro) {
        this.livro = livro;
    }
    public Integer getQuantidade() {
        return quantidade;
    }
    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }
}

Fabio, suas classes e xhtml estão certinhos, vc poderia passar o log completo do erro?

pode ser que tenha alguma outra pista do que está acontecendo.

abraço!

Samir, obrigado pela ajuda, mas achei o erro, eu estava utilizando import antlr.collections.List; e na verdade eu tinha que utilizar o import java.util.List;

Mesmo assim obrigado!!!

solução!

Fala Fabio! que bom que achou o problema =).

Qualquer outro problema que tiver manda pra gnt.

abraço