Prezados,
seguindo as instruções conforme segue o curso, me deparei com a classe LazyDataModel não compilando.
Tentei algumas alternativas (conforme sugerido aqui), porém não funcionou. Alguém pode me ajudar?
Segue o código da classe:
Código antes de refatorar DAO
public class LivroDataModel extends LazyDataModel<Livro> {
private DAO<Livro> dao;
public LivroDataModel() {
this.dao = new DAO<Livro>(Livro.class);
super.setRowCount(dao.contaTodos());
}
@Override
public List<Livro> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) {
List<String> colunas = new ArrayList<String>();
List<String> valores = new ArrayList<String>();
for (Entry<String, Object> entry : filters.entrySet()) {
colunas.add(entry.getKey());
valores.add(entry.getValue().toString());
}
return this.dao.listaTodosPaginada(first, pageSize, colunas, valores);
}
}
Após refatorar a classe DAO, que agora recebe o EntityManger como parâmetro em seu construtor, tentei o seguinte (porém ainda não funcionando):
@Named
@ViewScoped
public class LivroDataModel extends LazyDataModel<Livro> {
@Inject
private LivroDAO livroDAO;
@PostConstruct
void init(){
super.setRowCount(livroDAO.contaTodos());
}
@Override
public List<Livro> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) {
List<String> colunas = new ArrayList<String>();
List<String> valores = new ArrayList<String>();
for (Entry<String, Object> entry : filters.entrySet()) {
colunas.add(entry.getKey());
valores.add(entry.getValue().toString());
}
return this.livroDAO.listaTodosPaginada(first, pageSize, colunas, valores);
}
}
Porém o comportamento estranho que percebi é:
O método load
é chamado antes de ocorrer a injeção e antes da chamada ao PostConstruct
. Tentei utilizando um construtor também, porém não funcionou...
A única forma que consegui fazer funcionar foi sem utilizar o CDI:
public class LivroDataModel extends LazyDataModel<Livro> {
private DAO<Livro> livroDAO;
public LivroDataModel() {
this.livroDAO = new DAO<Livro>(new JPAUtil().getEntityManager(), Livro.class);
super.setRowCount(livroDAO.contaTodos());
}
@Override
public List<Livro> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) {
List<String> colunas = new ArrayList<String>();
List<String> valores = new ArrayList<String>();
for (Entry<String, Object> entry : filters.entrySet()) {
colunas.add(entry.getKey());
valores.add(entry.getValue().toString());
}
return this.livroDAO.listaTodosPaginada(first, pageSize, colunas, valores);
}
}
Há alguma forma de conseguir fazer funcionar utilizando o CDI? Esta classe aparentemente não foi exibida no vídeo (talvez por ter sido desafio do outro módulo).