Listar Tudo Generico nao funciona com Struts

Eu tenho uma classe HibernateGenerico que faz o CRUD e nele tem um metodo listaTudo(), eu testei este metodo esta funcionando normalmente quando eu uso minha classe de teste, mas quando eu vou usar ele com o Struts nao esta dando certo… alguem tem ideia do que pode ser? Obrigado!!!


import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

public class GenericoHibernateDao<T> implements Dao<T>  {
	
	private Session session;
	private Class classePersistente;
	
	public GenericoHibernateDao(Session session, T t){
		
		this.session = session;
		this.classePersistente = t.getClass();
		
	}

	@Override
	public void salva(T t) {

		this.session.beginTransaction();
		this.session.save(t);
		this.session.getTransaction().commit();
		
		
	}

	@Override
	public void remove(T t) {
		
		this.session.beginTransaction();
		this.session.delete(t);
		this.session.getTransaction().commit();
		
	}

	@Override
	public void atualiza(T t) {

		this.session.beginTransaction();
		this.session.update(t);
		this.session.getTransaction().commit();
	}
	@Override
	public List<T> listaTudo(T t) {
		
		return (List<T>)session.createCriteria(t.getClass()).list();

		 
		
	}

}

Action

import java.util.List;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.hibernate.Session;

import br.com.jp.hibernate.Dao;
import br.com.jp.hibernate.Funcionario;
import br.com.jp.hibernate.GenericoHibernateDao;
import br.com.jp.hibernate.HibernateUtil;

public class ListaFuncionariosAction {
	
	private Funcionario func;
	
	private List <Funcionario> funcionario;

	


	@Action(value="listaFuncionarios", results={
			@Result(name="ok", location="lista-funcionarios.jsp")
			
	})
	public String execute(){
		
		Session session = new HibernateUtil().getSession();
		Dao<Funcionario> dao = new GenericoHibernateDao<Funcionario>(session, func);
		funcionario=dao.listaTudo(func);
		
		return "ok";
		
	}

	public List<Funcionario> getFuncionario() {
		return funcionario;
	}


	public Funcionario getFunc() {
		return func;
	}
	

}

Erro


HTTP Status 500 -

type Exception report

message

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

exception

java.lang.NullPointerException
	br.com.jp.hibernate.GenericoHibernateDao.<init>(GenericoHibernateDao.java:16)
	br.com.jp.loja.action.ListaFuncionariosAction.execute(ListaFuncionariosAction.java:31)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
	com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
	org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
	org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.

O problema é que o func de sua action esta vindo nulo. Como ele é passado para o construtor do seu GenericDAO, esta classe, ao tentar descobrir a classe do objeto passado como parâmetro resulta em NullPointerException.

Reparei que você não criou um setter para ele, apenas um getter em sua action. O Struts depende da convenção Java Bean para poder disponibilizar o funcionário em sua action. Faça um teste, crie o setter.

Abraço

Uma dica:

Se tivesse usado o CoC do Struts2 nem precisaria da anotação @Action que a configuração seria “automática”.

[quote=Flavio Almeida]O problema é que o func de sua action esta vindo nulo. Como ele é passado para o construtor do seu GenericDAO, esta classe, ao tentar descobrir a classe do objeto passado como parâmetro resulta em NullPointerException.

Reparei que você não criou um setter para ele, apenas um getter em sua action. O Struts depende da convenção Java Bean para poder disponibilizar o funcionário em sua action. Faça um teste, crie o setter.

Abraço[/quote]

Ola Amigo… eu ja fiz o set e o problema continua… se tiver mais alguma ideia… obrigado!!

[quote=jyoshiriro]Uma dica:

Se tivesse usado o CoC do Struts2 nem precisaria da anotação @Action que a configuração seria “automática”.[/quote]

Sobre o CoC… eu ainda nao conheço eu ainda estou aprendendo … vc tem algo que possa me indicar pra eu estudar? Obrigado!!

Cole sua página para que eu possa vê-la.

Sugiro uma coisa: os atributos de sua action estão confusos: func, funcionario no singular para indicar uma lista.
Para a coisa ficar mais clara, troque func para funcionario e funcionario para funcionarios. Não esqueça de criar os getters e setters respectivos para atender o framework.

Abraço!

Tenta usar reflection no construtor

public GenericoHibernateDao(Session session){
		
		this.session = session;
		this.classePersistente = (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
		
	}

e na busca é só colocar assim

	@Override
	public List<T> listaTudo() {
		
		return (List<T>)session.createCriteria(classePersistente).list();

		 
		
	}

como tu não vai procurar nenhum objeto em especifico no banco então não precisa de um parametro para o metodo listaTudo, e este metodo que utilizei só funciona se ouver uma classe mais especifica extendendo essa, mas já é uma solução.

Segue o JSP… eu ja adicionei os setters que estavam faltando na action, mas continua com problemas… vlw

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Lista Funcionários</title>
</head>
<body>

	<table border="1">

	<tr>
	
		<th>Id</th>
		<th>Nome</th>
		<th>Endereço</th>
		<th>Telefone</th>
		
	</tr>
	
	<c:forEach items="${funcionario }" var="funcionarios">
	
		<tr>
		
			<td>${funcionarios.id }</td>
			<td>${funcionarios.nome}</td>
			<td>${funcionarios.endereco }</td>
			<td>${funcionarios.telefone }</td>
		
		</tr>
	
	</c:forEach>
	
	
	</table>

</body>
</html>

Pelo seu código, seu “func” no seu action nunca será preenchido. Esta me parecendo que você o adicionou como um “quebra-galho” para saber a classe da entidade para usar no seu GenericDAO.

Para solucionar o problema, mas de maneira deselegante, é você dar new, só para a sua classe GenericDAO não ganhar NullPointerException.

  Dao<Funcionario> dao = new GenericoHibernateDao<Funcionario>(session,new Funcionario());  

Teste se isso funciona. Se funcionar, temos como melhorar seu código. Mas volta aqui viu!

Abraço

Flavio… fiz a alteração que vc falou e continua nao dando certo… rs

Com essa alteração, você reparou se o erro ainda é o mesmo? Tem como enviar a nova stack trace?
Abraço!

Eu estou um pouco enrolado no trabalho hoje, mas estou curioso sobre este problema…

[quote=Flavio Almeida]Com essa alteração, você reparou se o erro ainda é o mesmo? Tem como enviar a nova stack trace?
Abraço!

Eu estou um pouco enrolado no trabalho hoje, mas estou curioso sobre este problema…[/quote]

Desculpa ai… eu nao tinha percebido que voce pediu pra eu colocar o new na referencia… agora deu certinho

Pois bem. O problema é que seu “func” só esta existindo para “tapar” o buraco do seu dao, que precisa obter a classe da Entidade que ele esta trabalhando.
Você precisa alterar o seu código para que ele não dependa desse objeto (que não faz sentido nesta action) e há várias formas de se conseguir isso.
Só percebi isso quando você colocou a página.

Abraço

[quote=Flavio Almeida]Pois bem. O problema é que seu “func” só esta existindo para “tapar” o buraco do seu dao, que precisa obter a classe da Entidade que ele esta trabalhando.
Você precisa alterar o seu código para que ele não dependa desse objeto (que não faz sentido nesta action) e há várias formas de se conseguir isso.
Só percebi isso quando você colocou a página.

Abraço[/quote]

Legal… vou fuçar no codigo pra arrumar ele… mas agradeço muito a sua atenção e ajuda… muito obrigado… abraço