Pagina JSF nao inicializa NullPointerException

Boa noite meus amigos, estou tentando transformar uma aplicacao JSP que funcionava para uma aplicacao JSF, para um trabalho de faculdade, aproveitei as classes mais genericas como dao, controller, model e atualizei as views para funcionarem com JSF, porem nao consigo acessar a pagina que devia trazer uma lista de produtos do banco de dados e exibir em uma tabela via JSF. o erro e o seguinte:

message java.lang.NullPointerException

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: java.lang.NullPointerException
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.NullPointerException
	javax.faces.webapp.UIComponentClassicTagBase.setJspId(UIComponentClassicTagBase.java:1856)
	org.apache.jsp.ListaProdutos_jsp._jspx_meth_f_005fview_005f0(ListaProdutos_jsp.java:226)
	org.apache.jsp.ListaProdutos_jsp._jspService(ListaProdutos_jsp.java:193)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.56 logs.

a pagina em questao e a seguinte:

> <%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

<html>
  
    <head>
        
        <title>Lista de Produtos</title>
       
    </head>
    <body>
        
        <f:view>
        
        <div id="tabela">   
            
            <h1>Lista de Produtos</h1>
              
            <h:form>
            <h:dataTable value="#{produtosView.todos}" var="item" border="1" cellpadding="2" cellspacing="0" styleClass="tabela" headerClass="cabecalho" rowClasses="linha_a, linha_b">
                <f:facet name="header">
                    <h:outputText value="Mostrar Produtos"/>
                </f:facet>
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Codigo"/>
                    </f:facet>
                    <h:commandLink action="#{produtosView.editar}" value="#{item.codigo}"/>
                </h:column>
                
                 <h:column>
                    <f:facet name="header">
                        <h:outputText value="Marca"/>
                    </f:facet>
                     <h:outputText value="#{produtosView.marca}"/>
                </h:column>
                
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Tipo"/>
                    </f:facet>
                     <h:outputText value="#{produtosView.tipo}" converter="convertDate"/>
                </h:column>
                
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Categoria"/>
                    </f:facet>
                     <h:outputText value="#{produtosView.categoria}" converter="convertDate"/>
                </h:column>
                
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Valor"/>
                    </f:facet>
                     <h:outputText value="#{produtosView.valor}" converter="convertDate"/>
                </h:column>
                
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Excluir Produto"/>
                    </f:facet>
                    <h:commandLink action="#{produtosView.excluir}" value="Excluir"/>
                </h:column>
            </h:dataTable>
            <h:commandLink action="#{produtosView.novoProduto}" value="Cadastrar novo Produto"/>
            </h:form>    

        </div>
        <br>

       </f:view> 
    </body>
</html>

A classe produtosView chama metodos da classe produtosController, segue codigo dela:

> package controller;
> 
> import dao.InterProdutosDAO;
> import dao.ProdutoDAO;
> import dao.ProdutoDAOException;
> import javax.faces.model.DataModel;
> import javax.faces.model.ListDataModel;
> 
> import model.Produto;
> import dao.*;
> 
> public class ProdutosController {
>     private Produto produto;
>     private DataModel model;
>     
>     public String novoProduto() {
>         this.setProduto(new Produto());
>         return "novo";
>     }
> 
>     /**
>      * @return the produto
>      */
>     public Produto getProduto() {
>         return produto;
>     }
> 
>     /**
>      * @param produto the produto to set
>      */
>     public void setProduto(Produto produto) {
>         this.produto = produto;
>     }
>     
>     public DataModel getTodos() throws ProdutoDAOException {
>         InterProdutosDAO idao = new ProdutoDAO();
>         model = new ListDataModel(idao.listaProdutos());
>         return model;
>     }
>     
>     public Produto getProdutoFromEditOrDelete() {
>         Produto produto = (Produto)model.getRowData();
>         return produto;
>     }
>     
>     public String editar() {
>         Produto produto = getProdutoFromEditOrDelete();
>         setProduto(produto);
>         return "editar";
>     }
>     
>     public String update() throws ProdutoDAOException {
>         InterProdutosDAO idao = new ProdutoDAO();
>         idao.atualizarProduto(produto);
>         return "sucesso_atu";
>     }
>     
>     public String excluir() throws ProdutoDAOException {
>         InterProdutosDAO idao = new ProdutoDAO();
>         Produto produto = getProdutoFromEditOrDelete();
>         idao.excluirProduto(produto);
>         return "sucesso_exc";
>     }
>     
>     public String create() throws ProdutoDAOException {
>         InterProdutosDAO idao = new ProdutoDAO();
>         idao.salvarProduto(produto);
>         return "sucesso_ins";
>     }
> }

Alguem saberia me nortear sobre o porque desse erro acontecer? Peco desculpas se for alguma pergunta trivial/erro bobo, estou iniciando em JSP/JSF. Desde ja agradeco a ajuda!

UPDATE: Depurando o codigo agora, percebi que ele para de navegar no <f:view>, ele sequer entra nessa tag :confused:

Não entendo de JSF, mas não deveria ter uma annotation no seu controller ProdutosController para dizer que ele é um ManagedBean?
@ManagedBean(name = “meuBean”)
@RequestScoped

E coloque esse Topico na categoria java

Movido para a categoria Java, obrigado por avisar!

Eu adicionei o managed bean no produtosController, e agora ele me retornou um erro diferente:

type Exception report

message An exception occurred processing JSP page /ListaProdutos.jsp at line 107

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /ListaProdutos.jsp at line 107

104:     </head>
105:     <body>
106:         
107:         <f:view>
108:         
109:         <div id="tabela">   
110:             


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.NullPointerException
	javax.faces.webapp.UIComponentClassicTagBase.setJspId(UIComponentClassicTagBase.java:1856)
	org.apache.jsp.ListaProdutos_jsp._jspx_meth_f_005fview_005f0(ListaProdutos_jsp.java:227)
	org.apache.jsp.ListaProdutos_jsp._jspService(ListaProdutos_jsp.java:194)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.56 logs.

Ao que me parece o <f:view> precisa enxergar o produtosController mas nao esta conseguindo o fazer

Altere a extensão da tela para .xhtml

Colocou o nome “produtosView” no seu ManagedBean?

Coloquei sim, a IDE esta sinalizando erro no name, coloquei da seguinte forma:

package controller;

import dao.InterProdutosDAO;
import dao.ProdutoDAO;
import dao.ProdutoDAOException;
import javax.annotation.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import model.Produto;

@ManagedBean(name = "produtosView")
@RequestScoped
public class ProdutosController{
      
    private Produto produto;
    private DataModel model;
    
    
    public String novoProduto() {
        this.setProduto(new Produto());
        return "novo";
    }

    public Produto getProduto() {
        return produto;
    }
    public void setProduto(Produto produto) {
        this.produto = produto;
    }

acho legal mostrar meu arquivo faces-config.xml tbm, pode ajudar nessa questao:

<?xml version='1.0' encoding='UTF-8'?>

<managed-bean>
    <managed-bean-name>produtosView</managed-bean-name>
    <managed-bean-class>
        controller.ProdutosController
    </managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<navigation-rule>
    <navigation-case>
        <from-outcome>mostrar</from-outcome>
        <to-view-id>/ListaProdutos.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

<navigation-rule>
    <display-name>formProdutos</display-name>
    <from-view-id>/formAtualizarProdutos.jsp</from-view-id>
    <navigation-case>
        <from-outcome>sucesso_ins</from-outcome>
        <to-view-id>/ListaProdutos.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

<navigation-rule>
    <display-name>mostrarProdutos</display-name>
    <from-view-id>/ListaProdutos.jsp</from-view-id>
    <navigation-case>
        <from-outcome>editar</from-outcome>
        <to-view-id>/formAtualizarProduto.jsp</to-view-id>
    </navigation-case>
</navigation-rule>
       
<navigation-rule>
    <display-name>atualizarProdutos</display-name>
    <from-view-id>/formAtualizarProduto.jsp</from-view-id>
    <navigation-case>
        <from-outcome>sucesso_atu</from-outcome>
        <to-view-id>/ListaProdutos.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

<navigation-rule>
    <display-name>mostrarProdutos</display-name>
    <from-view-id>/ListaProdutos.jsp</from-view-id>
    <navigation-case>
        <from-outcome>sucesso_exc</from-outcome>
        <to-view-id>/ListaProdutos.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

<navigation-rule>
    <display-name>mostrarProdutos</display-name>
    <from-view-id>/ListaProdutos.jsp</from-view-id>
    <navigation-case>
        <from-outcome>novo</from-outcome>
        <to-view-id>/CadastrarProdutos.jsp</to-view-id>
    </navigation-case>
</navigation-rule>    

Faça um teste usando o System.out.print para exibir os dados dos produtos. Acho que é por ai que voce devia começar. NullPonitetException é erro de algum objeto nulo, talvez voce tenha esquecido de intancia-lo onde devia

Não sabia que estava mapeando o ManagedBean no faces-config.xml. Use o xml ou as annotations.

Irei fazer isso tambem para verificar.

Mostrando o erro que a IDE esta sinalizando no campo name do ManagedBean.

Ah sim, acho que explica o erro que a ide estava sinalizando rs peco desculpas por nao ter postado o faces-config.xml antes

o problema de printar os valores que sao passados pelos parametros, e que a aplicacao nem entra na tag de <f:view> do listarProdutos, por conta disso nao consigo saber o que tem chego nos locais onde tem o produtosView.getAlgumaCoisa .

Você colocou a anotação @ManagedBean errada

A correta é:

import javax.faces.bean.ManagedBean;

Na página xhtml, troque head por h:head, body por h:body, remove as suas taglibs e coloca os namespaces abaixo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets" >

    <h:head>

    </h:head>

    <h:body>

    </h:body>
</html>

Eu sugiro você a criar um projeto do 0 só para tentar fazer um Hello World, e depois um outro projeto para “copiar” as classes.

Não sei como você esta fazendo, mas não tente transformar um projeto servlet/jsp em jsf, é mais fácil e melhor criar um projeto jsf

EDIT:
Você esta seguindo algum tutorial?

Se você não tem nenhum curso de jsf, da uma olhada nesse material:

Muito obrigado pela ajuda, eu consegui resolver ontem porém não deu tempo de postar aqui.

Seguinte, conforme citei no inicio do tópico, chances altas de ser um erro bobo rs, o problema era que eu estava tentando acessar a pagina sem chamar a url localhost:porta**/faces/**pagina.jsp, eu estava chamando localhost:porta/pagina.jsp. Sob meu conhecimento, ao depurar a pagina eu percebi que ela nao acessava a tag <f:view> por conta desse equivoco, e eu acredito que o NullPointer se deu neste caso justamente por isso, por nao conseguir entrar nas tags <f:view> consequentemente ele tambem nao acessava as tags que preenchem as variaveis como a que retorna a list e preenche a tabela por exemplo. Me corrijam se estiver errado rs.r.

Agradeço fortemente a ajuda de todos pessoal, aprendi muito com vocês por mais que fosse uma solução diferente da proposta de todos.

Muito obrigado pelas dicas, vou dar uma olhada sim neste material para estudar mais sobre o assunto :slight_smile:

Não use páginas jsp para aplicações JSF, utilize xhtml :+1:

Então você também alterou o pacote para javax.faces.bean.ManagedBean, pois javax.annotation.ManagedBean não funciona, a menos que você tenha voltado atras e configurado o ManagedBean pelo xml

Sim, o managedBean em questão foi configurado pelo faces-config.xml.

Isso ai era necessário na versão 1, hoje estamos na 2.3

A versão com configuração via annotations é a partir da versão 2.0, que surgiu em 2009, de lá pra cá mudou muita coisa

Praticamente mais nada é configurado via xml, apenas arquivos de mensagens, locale e phase-listener (que deve vir a ser configurado via annotations na próxima versão)