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