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

LazyDataModel Como utilizar com CDI ?

Estou com duvida com relação a implementação do LazyDataModel, como podemos utilizar com o componente do CDI ?

No meu caso a implementação não retorna a lista de livros.

public class LivroDataModel extends LazyDataModel<Livro> {

    private static final long serialVersionUID = 864366873420025201L;

    @Inject
    EntityManager em;

    private DAO<Livro> dao;

    @PostConstruct
    void init(){
        this.dao = new DAO<Livro>(this.em, Livro.class);
    }

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

    @Override
    public List<Livro> load(int inicio, int quantidade, String campoOrdenacao, SortOrder sentidoOrdenacao, 
            Map<String, Object> filtros) {
        // TODO Auto-generated method stub
        String titulo = (String) filtros.get("titulo");
            return dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo);
    }
}
3 respostas
solução!

Oi Pablo,

Coloca essa linha:

super.setRowCount(dao.quantidadeDeElementos());

Dentro do método init que está anotado com PostConstruct.

O PostConstruct só é chamado depois que seu objeto já foi construído, então passar a quantidade de linhas dentro do construtor não vai adiantar muito.

Outra coisa, posta como está a implementação do seu Dao também?

Abraço!

Ola Joviane tudo bem ? Fiquei feliz em ver sua resposta eu tive aula com você na Caelum a uns 3 anos atrás, de Java Web da formação Java.

Fiz conforme a sua orientação movendo para dentro do Init, e no meu DAO eu fiz a injeção pelo CDI e deu tudo certo ... Obrigado.

Segue a implementação para ajuda dos nossos amigos...

@Named
@ViewScoped
public class LivroBean implements Serializable {

//Codigo omitido
    @Inject
    private LivroDataModel livroDataModel;

    public LivroDataModel getLivroDataModel() {
        return livroDataModel;
    }

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

//Codigo Omitido
@Named
@ViewScoped
public class LivroDataModel extends LazyDataModel<Livro> {

    private static final long serialVersionUID = 864366873420025201L;

    @Inject
    EntityManager em;

    private DAO<Livro> dao;

    @PostConstruct
    void init(){
        this.dao = new DAO<Livro>(this.em, Livro.class);
        super.setRowCount(dao.quantidadeDeElementos());
    }

    @Override
    public List<Livro> load(int inicio, int quantidade, String campoOrdenacao, SortOrder sentidoOrdenacao, 
            Map<String, Object> filtros) {
        // TODO Auto-generated method stub
        String titulo = (String) filtros.get("titulo");
            return dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo);
    }
}
//Codigo Omitido
<p:dataTable value="#{livroBean.livroDataModel}" id="tabelaLivros" lazy="true" var="livro" paginator="true" rows="5">
                <f:facet name="header">Livros</f:facet>
                <p:column sortBy="#{livro.titulo}" filterBy="#{livro.titulo}"
                    filterMatchMode="startsWith">
                    <f:facet name="header">Titulo</f:facet>
                    <h:outputText value="#{livro.titulo}"></h:outputText>
                </p:column>
                <p:column sortBy="#{livro.isbn}" filterBy="#{livro.isbn}"
                    filterMatchMode="contains">
                    <f:facet name="header">ISBN</f:facet>
                    <h:outputText value="#{livro.isbn}"></h:outputText>
                </p:column>
                <p:column sortBy="#{livro.preco}" filterBy="#{livro.preco}"
                    filterFunction="#{livroBean.precoEhMenor}">
                    <f:facet name="header">Preço</f:facet>
                    <h:outputText value="#{livro.preco}">
                        <f:convertNumber type="currency" pattern="R$ #0.00"
                            currencySymbol="R$" locale="pt_BR"></f:convertNumber>
                    </h:outputText>
                </p:column>
                <p:column>
                    <f:facet name="header">Data</f:facet>
                    <h:outputText value="#{livro.dataLancamento.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy HH:mm"
                            timeZone="America/Sao_Paulo" />
                    </h:outputText>
                </p:column>
                <p:column>
                    <f:facet name="header">Remover</f:facet>
                    <p:commandLink value="remover" action="#{livroBean.remover(livro)}"
                        process="@form" update="@form :formDadosDoLivro" />
                </p:column>
                <p:column>
                    <f:facet name="header">Alterar:</f:facet>
                    <p:commandLink value="alterar"
                        action="#{livroBean.carregar(livro)}" process="@form"
                        update="@form :formDadosDoLivro"></p:commandLink>
                </p:column>
            </p:dataTable>
//Codigo Omitido

Estou com o mesmo problema, em partes resolvi seguindo a sugestão acima, no entanto não aparece as demais páginas, fica apenas na primeira no datatable.