ManagedBean retornando NullPointerException

8 respostas
jsfjava
E

Boa tarde meu povo.
Preciso de uma ajudinha aqui, estou montando um projeto com jsf+jdbc.
Criei a ConnectionFactory, os DAOs e o ManagedBean, porém estou tendo uma série de problemas com essa conexão. Primeiro o erro apontava que o Driver não estava sendo encontrado, mesmo eu tendo adicionado ele usando maven… Resolvi isto Adicionando a linha Class.forName(“com.mysql.jdbc.Driver”) - cheguei a ler que este método não era mais necessário, mas sem isto o projeto não está encontrando o driver…
Após adicionar isso ele me retorna nullPointer. O que está me deixando louco, é que o DAO funciona, testei ele com uma classe main que montei para testar os DAOs antes conectá-los aos MBs.

Sou iniciante, então acredito que seja algum erro bobo de lógica que me passou despercebido.
Se puderem me dar aquela ajuda, agradeço.

Erro retornado pelo console:

Caused by: java.lang.NullPointerException

at com.escolhacerta.model.CategoriaDAO.listarCategoria(CategoriaDAO.java:43)

at com.escolhacerta.managedBeans.ProdutoManagedBean.getCategorias(ProdutoManagedBean.java:44)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at javax.el.BeanELResolver.getValue(BeanELResolver.java:241)

at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)

at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)

at com.sun.el.parser.AstValue.getValue(AstValue.java:139)

at com.sun.el.parser.AstValue.getValue(AstValue.java:203)

at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)

at com.sun.faces.facelets.el.ELText$ELTextVariable.toString(ELText.java:228)

at com.sun.faces.facelets.el.ELText$ELTextComposite.toString(ELText.java:161)

at com.sun.faces.facelets.compiler.CommentInstruction.write(CommentInstruction.java:77)

at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)

at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:183)

at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)

at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)

at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:458)

at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:134)

at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)

at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)

at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)

at javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)

 42 more

ConnectionFactory:

package com.escolhacerta.util;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;
public class ConnectionFactory {

public Connection getConnection() throws ClassNotFoundException {

// o erro está aqui. (classnotfound, causa um nullpointerexception

Class.forName(com.mysql.jdbc.Driver);

try{

return DriverManager.getConnection(

//ip/porta/nomedobanco

//“jdbc:mysql://localhost:3306/escolhacertaBD?useTimezone=true&serverTimezone=UTC”	

jdbc:mysql://localhost:3306/escolhacertaBD”

,root

,root		

);

} catch(SQLException excecao) {

throw new RuntimeException(excecao);

}

}

DAO que me retorna a Exception:

package com.escolhacerta.model;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import com.escolhacerta.control.Categoria;
import com.escolhacerta.util.ConnectionFactory;

public class CategoriaDAO {

private Connection conn;

//private String categorias;

private List categorias = new ArrayList();

private Categoria c = new Categoria();
public CategoriaDAO() {
	try{
		this.conn = new ConnectionFactory().getConnection();
	}catch(ClassNotFoundException cn){
		System.out.println(cn);
	}
}

public boolean addCategoria(){
	try{
		PreparedStatement stmt = conn
				.prepareStatement("insert into categoria (nmCategoria) values (?)");
		
		stmt.setString(1, c.getCategoria());
		return true;
	}catch(SQLException ex){
		throw new RuntimeException(ex);
	}
	
}

public List<String> listarCategoria() throws SQLException{
		String ctg = "SELECT * FROM categoria;";
		PreparedStatement ps = conn.prepareStatement(ctg);
		//Executa o comando de consulta aonde guarda os dados retornados dentro do ResultSet.
		ResultSet rs = ps.executeQuery();
		//Faz a verificação enquanto houverem registros, percorre e resgata os valores
		while(rs.next()){				
			Categoria c = new Categoria();
			//c.setCategoria(rs.getString(1));
			c.setCategoria(rs.getString("nmCategoria"));
			categorias.add(c.getCategoria().toString());
		}
		ps.execute();
		rs.close();
		ps.close();
		
		return categorias;

}

}

Trecho da página onde fiz a ligação do ManagedbBean:

<!-- Menu de categorias -->
<div class="d-none d-sm-block">
	<div class="fluid-continer">				
		<ul>
			<ui:repeat var="categoria" value="#{produtoManagedBean.categorias}">
				<li class="inline-items d-inline line-height: 1;">
					| Produto 1
					<h:dataTable value="#{produtoManagedBean.categorias}" var="categoria">
						<h:column>
							#{categoria.categoria}
						</h:column>
					</h:dataTable>
				</li>		
							
				<div class="btn-group">
				<h:form id="categoria">						
					<h:commandButton value="Mais Categorias"
						styleClass="btn dropdown-toggle" 
						jsf:data-toggle="dropdown" 
						jsf:aria-haspopup="true" 
						jsf:aria-expanded="false"							
					/>
																
					<ul class="dropdown-menu dropdown-menu-right">
					   <li>
					   		<h:commandLink value="#{produtoManagedBean.categorias}"
								action="index_jsf"
								styleClass="dropdown-item"
							/>
					   	</li>				   
					</ul>
				</h:form>
				</div>					
			</ui:repeat>
		</ul>
	</div>
</div>

8 Respostas

darlan_machado

Não é no managed bean, é na linha 43 da classe CategoriaDAO, especificamente, o método listarCategoria.

E

Então Darllan… o problema é que esse listarCategoria() está funcionando… testei em uma classe de testes, ele consegue fazer o SELECT e retornar os valores no console do Eclipse… o problema só acontece ao fazer a ligação com o HTML =( =(

Por isso acho que o problema é no MB…

darlan_machado

O que tem nesta linha?

E

É a segunda linha do método listarCategoria() da classe CategoriaDAO:

PreparedStatement ps = conn.prepareStatement(ctg);

quando debuguei esse conn aparecia como nulo, o interessante é que eu iniciei ele, recebe uma instância do Connection Factory no construtor…

darlan_machado

Simples, a variável conn está nula.
Se ela está nula e você inicializou, provavelmente o método getConnection está devolvendo algo que não deveria.

Você tem o driver do mysql no teu classpath?

E

Baixei o 8.0.2 com o Maven usando o pom.xml, depois testei um mais antigo, 6.0, para ver se não podia ser algum problema na versão…

darlan_machado

Cara, acho que essa forma de conexão não é mais aceita para as novas versões do MySQL. Dá uma pesquisada.

E

Beleza! Vou pesquisar a fundo aqui!!
Valeu a força e a paciência Darlan!

Criado 9 de outubro de 2018
Ultima resposta 11 de out. de 2018
Respostas 8
Participantes 2