Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Não consigo identificar o erro no JSF

Estou com o erro famoso do NullPointerException, entretanto não consigo identificar o motivo do erro. O erro é o seguinte:

GRAVE: /livro.xhtml @66,45 cyrrencySymbol="R$" Unhandled by MetaTagHandler for type org.primefaces.convert.NumberConverter
out 12, 2017 3:50:22 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
GRAVE: Error Rendering View[/livro.xhtml]
java.lang.NullPointerException
    at br.com.caelum.livraria.modelo.LivroDataModel.<init>(LivroDataModel.java:23)
    at br.com.caelum.livraria.bean.LivroBean.<init>(LivroBean.java:40)

Está informando que o está retornando Null da classe LivroDataModel. A classe é a seguinte:

package br.com.caelum.livraria.modelo;

import java.io.Serializable;
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;

@SuppressWarnings("serial")
public class LivroDataModel extends LazyDataModel<Livro> implements Serializable{

    @Inject
    private LivroDao dao;


    public LivroDataModel(){
        super.setRowCount(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 dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo);
    }    
}

Parece que o erro está no momento de executar o dao.quantidadeDeElementos(). Ele nem chega a executar esse método e eu não sei o motivo, não sei se o problema é no JPA, no JSF ou no CDI.

Por gentileza, alguém poderia me ajudar?

3 respostas

Olá Gustavo, O seu dao está nulo. A injeção da dependência não funcionou. Como você está usando a anotação "Inject", verifique se o CDI está corretamente configurado. Pode estar faltando alguma coisa.

Olá Renato,

A configuração está feita de acordo com o curso. Inseri o .jar da implementação Weld Servlet, inseri o context.xml no diretório WebContent/META-INF e inseri o beans.xml no diretório WEB-INF.

O conteúdo dos arquivos são os seguintes:

context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource name="BeanManager"
    auth="Container"
    type="jax.enterprise.inject.spi.BeanManager"
    factory="org.jboss.weld.resources.ManagerObjectFactory"/>
</Context>

beans.xml

<beans>
</beans>

Antes estava funcionando, mas tive que formatar minha máquina, então fiz o backup do projeto e estou tentando executá-lo novamente no eclipse, mas está ocorrendo esse erro que não consigo identificar o motivo.

solução

Olá Gustavo, então como sabemos, o CDI espera uma classe com construtor padrão, então tente substituir:

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

por:

@PostConstruct
    void init() {
        super.setRowCount(dao.quantidadeDeElementos());
    }

Ah, e de uma verificada na sua classe LivroBean, se você estiver instanciando LivroDataModel na mão, remova o new, e use a Injeção com @Inject

@Inject
    private LivroDataModel livroDataModel;