1
resposta

Problemas na injeção da classe LivroDataModel

Fiz as adaptações para o uso da CDI, conforme mostra os vídeos, no entanto ao tentar utilizar a questão da paginação, ocorre erro de nullpointer, não conseuindo ejetar a classe LivroDataModel.

Classe LivroBean

package br.com.caelum.livraria.bean;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.caelum.livraria.dao.AutorDAO;
import br.com.caelum.livraria.dao.LivroDAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.modelo.Livro;
import br.com.caelum.livraria.modelo.LivroDataModel;

@Named
@ViewScoped
public class LivroBean implements Serializable{

    private static final long serialVersionUID = -8400839805775029319L;
    private Livro livro = new Livro();
    private Integer autorId;
    private Integer livroId;
    private List<Livro> livros;    
    private List<String> generos = Arrays.asList("Romance", "Drama", "Ação");

    @Inject
    private LivroDataModel livroDataModel;

    @Inject
    private LivroDAO livroDAO;

    @Inject
    private AutorDAO autorDAO;

    public Integer getAutorId() {
        return autorId;
    }

    public void setAutorId(Integer autorId) {
        this.autorId = autorId;
    }

    public Livro getLivro() {
        return livro;
    }

    public Integer getLivroId() {
        return livroId;
    }

    public void setLivroId(Integer livroId) {
        this.livroId = livroId;
    }

    public void setLivro(Livro livro) {
        this.livro = livro;
    }

    public void gravar() {
        System.out.println("Gravando livro " + this.livro.getTitulo());

        if (livro.getAutores().isEmpty()) {
            // throw new RuntimeException("Livro deve ter pelo menos um
            // Autor.");
            FacesContext.getCurrentInstance().addMessage("autor",
                    new FacesMessage("Livro deve ter pelo menos um Autor."));
            return;
        }

        if (this.livro.getId() == null) {
            livroDAO.adiciona(this.livro);
            this.livros = livroDAO.listaTodos();
        } else {
            livroDAO.atualiza(this.livro);
        }

        livro = new Livro();
    }

    public List<Livro> getLivros() {        

        if (this.livros == null) {
            this.livros = livroDAO.listaTodos();
        }

        return this.livros;
    }

    public List<Autor> getAutores() {
        return autorDAO.listaTodos();
    }

    public void gravarAutor() {
        Autor autor = this.autorDAO.buscaPorId(this.autorId);
        this.livro.adicionaAutor(autor);
    }

    public List<Autor> getAutoresDoLivro() {
        return this.livro.getAutores();
    }

    public void comecaComDigitoUm(FacesContext fc, UIComponent component, Object value) throws ValidatorException {
        String valor = value.toString();
        if (!valor.startsWith("1")) {
            throw new ValidatorException(new FacesMessage("Deveria começar com 1"));
        }
    }

    public void carregaPelaId() {
        this.livro = this.livroDAO.buscaPorId(this.livroId);
    }

    public String formAutor() {
        System.out.println("Chamada o formulário do Autor");
        return "autor?faces-redirect=true";
    }

    public void remover(Livro livro) {
        System.out.println("Removendo o livro");
        this.livroDAO.remove(livro);
    }

    public void carregar(Livro livro) {
        System.out.println("Carregando o livro " + livro.getTitulo());
        // correto aqui seria utilizar uma consulta jql com fetch afim de sanar
        // o problema de lazy exception
        this.livro = livro;
    }

    public void removerAutorDoLivro(Autor autor) {
        System.out.println("Removendo autor do livro");
        this.livro.removerAutor(autor);
    }

    public LivroDataModel getLivroDataModel() {
        return livroDataModel;
    }

    public void setLivroDataModel(LivroDataModel livroDataModel) {
        this.livroDataModel = livroDataModel;
    }

    public boolean precoEhMenor(Object valorColuna, Object filtroDigitado, Locale locale) { // java.util.Locale

        // tirando espaços do filtro
        String textoDigitado = (filtroDigitado == null) ? null : filtroDigitado.toString().trim();

        System.out.println("Filtrando pelo " + textoDigitado + ", Valor do elemento: " + valorColuna);

        // o filtro é nulo ou vazio?
        if (textoDigitado == null || textoDigitado.equals("")) {
            return true;
        }

        // elemento da tabela é nulo?
        if (valorColuna == null) {
            return false;
        }

        try {
            // fazendo o parsing do filtro para converter para Double
            Double precoDigitado = Double.valueOf(textoDigitado);
            Double precoColuna = (Double) valorColuna;

            // comparando os valores, compareTo devolve um valor negativo se o
            // value é menor do que o filtro
            return precoColuna.compareTo(precoDigitado) < 0;

        } catch (NumberFormatException e) {

            // usuario nao digitou um numero
            return false;
        }
    }

    public List<String> getGeneros() {
        return generos;
    }

    public void setGeneros(List<String> generos) {
        this.generos = generos;
    }

}

Classe LivroDataModel

package br.com.caelum.livraria.modelo;

import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.com.caelum.livraria.dao.LivroDAO;

public class LivroDataModel extends LazyDataModel<Livro>{

    private static final long serialVersionUID = -7278079584563084534L;

    @Inject
    private LivroDAO dao;

    public LivroDataModel(){
        super.setRowCount(this.dao.quantidadeDeElementos());
    }

    @Override
    public List<Livro> load(int inicio, int quantidade, String campoOrdenacao, SortOrder sentidoOrdenacao, Map<String, Object> filtros) {
        String titulo = (String) filtros.get("titulo");
        return this.dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo);

    }

}
1 resposta

Olá,

O problema está no import no ViewScopped, com o CDI tem que usar o escopo próprio para ele no caso, troque

import javax.faces.view.ViewScoped;

por

import javax.enterprise.context.ViewScoped;