GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Pagina JSF nao inicializa NullPointerException


#1

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!


#2

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


#3

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


#4

E coloque esse Topico na categoria java


#5

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


#6

Altere a extensão da tela para .xhtml


#7

Colocou o nome “produtosView” no seu ManagedBean?


#8

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>    

#9

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


#10

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


#11

Irei fazer isso tambem para verificar.

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


#12

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


#13

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 .


#14

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:


#15

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.


#16

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


#17

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


#18

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


#19

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)