Carregar lista

23 respostas
P
Bem, eu fiz um post que não carrgava a minha lista. Depois percebi que nem sequer ele olhava para o meu MB. Vi que tudo na minha mpáquina estava bugado e o JBoss Tools é que tava criando todo esse problema. Então fiz o seguinte. Apaguei tudo, mas tudo mesmo, menos o projeto. Instalei um novo IDE Eclipse Helios SR2. Então instalei o GlassFish e será com ele que vamos trabalhar. Tentei novamente a listagem, e agora começou a dar erro 404, 500 - por incrível que pareça, fiquei feliz, pois ele agora tá lendo o meu MB. Deixei de usar Annotation e passei a mapear no faces-config. Acontece que minha pouca experiência nisso, não me permite ir removendo o erro. Alguns consigo e outros não. Veja como ficou meu projeto. Alguma coisa veio de exemplo e tenho dificuldade de entender e resolver, é óbvio. Meu ManagedBean(MB)
public class MostraEscolaAtiva implements Serializable{
    private static final int List = 0;
    private static final int Escola = 0;
    private List<Escola> escolas;
    private String nm = "Teste";
   
    public static int getList() {
        return List;
    }
    public static int getEscola() {
        return Escola;
    }
    public String getNm() {
        return nm;
    }
    public void setNm(String nm) {
        this.nm = nm;
    }
    public void handleToggle(ToggleEvent event) { 
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fieldset Toggled", "Visibility:" + event.getVisibility());   
        FacesContext.getCurrentInstance().addMessage(null, msg); 
    }    
    public List<Escola> getEscolas() {
        if(escolas.size()==0){   
            escolas = new ListaEscola().findAll();
            if(escolas.size() > 0){
                System.out.println(escolas.size());
            }else{
                System.out.println("A lista está vazia");
            }   
        }  
            return escolas;
    }
    public void setEscolas(List<Escola> escolas) {
        this.escolas = escolas;
    }
}
Meu DAOgenerico
public class DAOGenerico<T> implements DAO<T> {
   
    private Class<T> classe = null;
    protected EntityManager em = null;
   
    @SuppressWarnings("unchecked")
    public DAOGenerico(EntityManager em) {
        this.classe = (Class<T>) ((ParameterizedType) getClass()
                .getGenericSuperclass()).getActualTypeArguments()[0];
        this.em = em;
    }   
    @Override
    public T atualizar(T entidade) {
        em.merge(entidade);
        return entidade;
    }
    @Override
    public void inserir(T entidade) {
        em.persist(entidade);
    }
    @Override
    public T localizar(Object id) {
        return em.find(this.classe, id);
    }
    @Override
    public void remover(Object id) {
        em.remove(this.localizar(id));
    }
}
Meu singleton
public class EntityManagerFactorySingleton {
    private static EntityManagerFactory instancia = null;   
    private EntityManagerFactorySingleton() {
       
    }   
    public static EntityManagerFactory getInstance() {
       
        if (instancia == null){
            instancia = Persistence.createEntityManagerFactory("puMosaicoDigital");
        }
        return instancia;       
    }   
}
Meu Facelet(Onde está Escola X, Escola Y e Escola Z, deveria ser listado as Escolas de minha lista. Fiz fora disso pra ver se funfa, mas não funfou. Coloquei um System.out...para ver o que vem e não vi nada na saída, podem reparar no meu MB o System.out.println) Tá saindo o hreff
<div class="boxAzulGrandeMiddle">
                        <ul >
                            <li>&lt;aa rell='nofolloww' hreff="#" titlee="Escola X" class="lnkOver"&gt;Escola X</a></li>
                            <li>&lt;aa rell='nofolloww' hreff="#" titlee="Escola Y"&gt;Escola Y</a></li>
                            <li>&lt;aa rell='nofolloww' hreff="#" titlee="Escola Z"&gt;Escola Z</a></li>
                        </ul>

23 Respostas

R

Para mim vc num deveria colocar akela List dentro da primeira classe! Faria no DAO junto com os outros metodos!
deixaria só os getter e setters da classe! e o setEscolas ta errado não?

P

Você diz na classe DAOGenerico? Como assim o setList<EScola>… tá errado? Como deveria ser? Eu apenas deixei montar o padrão.

R

Sim vc faria no DAO Generico! esses dados vc carrega do banco? é persistido? o list é o item Escola carregado do banco ou algo assim?
se for não a necessidade de implementar um metodo list na classe escola! Pelo que eu sei o JSF só carrega dados de um Managed Bean!

eu olhei ali o seu setEscolas na sua logica esta correto!
vc disse q não consegue imprimir nada! eu olhei aki! vc colocou o else apos o segundo if! se ele num achar nada logo no primeiro não vai imprimir nada! eu mudei ali e coloquei no primeiro else!

if(){ if(){} }else{}

no seu codigo mostra!

public List<Escola> getEscolas() { if(escolas.size()==0){ escolas = new ListaEscola().findAll(); if(escolas.size() > 0){ System.out.println(escolas.size()); }else{ System.out.println("A lista está vazia"); // aki esta no 2º IF como ele esta aninhado dentro do 1º if! se não achar nada no primeiro ja num vai imprimir nada! } }else{ System.out.println("A lista está vazia"); // para fazer um teste coloque ele apos o primeiro IF } return escolas; }

P
Este é o meu ManagedBean
public class MostraEscolaAtiva implements Serializable{
	private static final int List = 0;
	private static final int Escola = 0;
	private List&lt;Escola&gt; escolas;
	private String nm = "Teste";
	
	public static int getList() {
		return List;
	}
	public static int getEscola() {
		return Escola;
	}
	public String getNm() {
		return nm;
	}
	public void setNm(String nm) {
		this.nm = nm;
	}
	public void handleToggle(ToggleEvent event) {  
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fieldset Toggled", "Visibility:" + event.getVisibility());    
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }	
	public List&lt;Escola&gt; getEscolas() {
		if(escolas.size()==0){    
            escolas = new ListaEscola().findAll();
            if(escolas.size() &gt; 0){
            	System.out.println(escolas.size());
            }else{
            	System.out.println(&quot;A lista está vazia&quot;);
            }	
        }   
            return escolas;
	}
	public void setEscolas(List&lt;Escola&gt; escolas) {
		this.escolas = escolas;
	}
}
Nem com o código abaixo funciona, está correto? Sou novo nessa bagaça e preciso fazer essa listagem funcionar hoje
&lt;h:form&gt;
					&lt;h:dataTable id="Escola" value="#{mostraEscolaAtiva.escolas}" var="esc"&gt;
						&lt;h:column&gt;
							&lt;h:outputText value="#{esc.nome}"&gt;&lt;/h:outputText&gt;
						&lt;/h:column&gt;
					&lt;/h:dataTable&gt;	 						 
				&lt;/h:form&gt;
No LOG do server, tá dando erro de NullPointerException
R

descobri seu erro hehe!
de onde vem esse metodo ListaEscola()?

escolas = new ListaEscola().findAll();
P
ListaEscola é uma classe. Tá tudo errado isso aí.
public class ListaEscola {	
	private EntityManager em;	
	private List&lt;Escola&gt; escola;
	
	public List&lt;Escola&gt; getEscola() {
		return escola;
	}
	public void setEscola(List&lt;Escola&gt; escola) {
		this.escola = escola;
	}
	public EntityManager getEm() {
		return em;
	}
	public void setEm(EntityManager em) {
		this.em = em;
	}
	protected EntityManager getEntityManager()  
    {  
        if (this.em == null)  
            throw new IllegalStateException("Erro");  
        return this.em;  
    }  	
	 public List&lt;Escola&gt; findAll() {    
         Query query =  getEntityManager().createQuery("select distinct e.nome " +     
                                                       "from " +    
                                                       "pessoa p inner join professor f on (p.idpessoa = f.idpessoa) " +    
                                                       "inner join matricula m on (m.idprofessor = f.idprofessor) " +    
                                                       "inner join escola e on (e.idescola = m.idescola)" +    
                                                       "where m.situacao = 'A'");    
         return (List&lt;Escola&gt;) query.getResultList();    
}
}
R

e retorna algo dessa lista? vc ja testou? teu codigo esta bem confuso mesmo!

P

eu sei, até eu já nem sei se isto aí funciona. Acho que não, pois nada me retorna nem o System.out.println que eu coloquei não me vem nada no console. Acho que a lista tá vazia e não sei o que fazer. Gostaria de uma luz. Vou apagar tudo, mas preciso de uma luz, principalmente no MBean e na classe que executa o método.

P

Acho que na minha ListaEscola está zicando tudo. Fiz um teste com main e veja o que resultou:

public class TestaTudo { public static void main(String[] args) { List&lt;Escola&gt; escola = new ListaEscola().findAll(); if(escola.size() &gt; 0){ System.out.println(escola.size()); }else{ System.out.println(&quot;A lista está vazia&quot;); } } }
Esse é o erro que deu

Exception in thread "main" java.lang.IllegalStateException: Erro
	at br.com.mosaicodigital.modelo.ListaEscola.getEntityManager(ListaEscola.java:38)
	at br.com.mosaicodigital.modelo.ListaEscola.findAll(ListaEscola.java:43)
	at TestaTudo.main(TestaTudo.java:19)
P

Falta fazer alguma coisa com a classe ListaEscola. Todos os DAO’s relacionados abaixo.

public class DAOGenerico&lt;T&gt; implements DAO&lt;T&gt; { private Class&lt;T&gt; classe = null; protected EntityManager em = null; @SuppressWarnings("unchecked") public DAOGenerico(EntityManager em) { this.classe = (Class&lt;T&gt;) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0]; this.em = em; } @Override public T atualizar(T entidade) { em.merge(entidade); return entidade; } @Override public void inserir(T entidade) { em.persist(entidade); } @Override public T localizar(Object id) { return em.find(this.classe, id); } @Override public void remover(Object id) { em.remove(this.localizar(id)); }}

public class EntityManagerFactorySingleton { private static EntityManagerFactory instancia = null; private EntityManagerFactorySingleton() { } public static EntityManagerFactory getInstance() { if (instancia == null){ instancia = Persistence.createEntityManagerFactory("puMosaicoDigital"); } return instancia; } }

public interface DAO&lt;T&gt; { void inserir(T entidade); void remover(Object id); T atualizar (T entidade); T localizar (Object id); }
Agora o que fazer com o ListaEscola, já não sei mais.

P
Troquei meu lista escola para isso aí, mas em modo Java Application me dá erro de Token Unexpected. Esse erro aparece no método findAll().
public class ListaEscola {
	private List&lt;Escola&gt; escola;
	
	public List&lt;Escola&gt; getEscola() {
		return escola;
	}

	public void setEscola(List&lt;Escola&gt; escola) {
		this.escola = escola;
	}

	public List&lt;Escola&gt; findAll() { 
		EntityManager em = EntityManagerFactorySingleton.getInstance().createEntityManager();
		EntityTransaction t = em.getTransaction();
		t.begin();
         Query query =  em.createQuery("select distinct e.nome " +     
                                                       "from " +    
                                                       "pessoa p inner join professor f on (p.idpessoa = f.idpessoa) " +    
                                                       "inner join matricula m on (m.idprofessor = f.idprofessor) " +    
                                                       "inner join escola e on (e.idescola = m.idescola)" +    
                                                       "where m.situacao = 'A'");    
         return (List&lt;Escola&gt;) query.getResultList();    
}
}
R

tipo! se eu fosse vc faria o basicao mesmo!
uma classe escola com as entidades do banco
uma classe DAO q criaria a lista, a inclusão, a exclusão etc! com querys do banco!
e uma controller q serviria de ponte para o front end esse seria o MB

P

Me dá esse erro, agora onde está esse on
[color=red]12:39:08,787 ERROR PARSER:33 - line 1:61: unexpected token: on[/color]
Daqui vem o erro

public List&lt;Escola&gt; findAll() { Query query = getEntityManager().createQuery("select distinct e.nome " + "from " + "pessoa p inner join professor f on (p.idpessoa = f.idpessoa) " + "inner join matricula m on (m.idprofessor = f.idprofessor) " + "inner join escola e on (e.idescola = m.idescola)" + "where m.situacao = 'A'"); return (List&lt;Escola&gt;) query.getResultList();

P

Se eu coloco apenas …(“from escola”) diz que escola não está mapeada. Acho que tem a ver com criteria isso. Preciso conhecer melhor HQL

R

ta usando Hibernate?

vc num mostrou a classe Escola

P
@Entity
public class Escola implements Serializable{
    @Id
    @GeneratedValue
	private long idescola;
	private String nome;
	private String telefone;
	private String fax;
	private String email;
	
	public Escola(){
	}	
	public Escola(long idescola,String nome, String telefone,String fax,String email){
		this.idescola = idescola;
		this.nome     = nome;
		this.telefone = telefone;
		this.fax      = fax;
		this.email    = email;
	}	
	public long getIdescola() {
		return idescola;
	}
	public void setIdescola(long idescola) {
		this.idescola = idescola;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	public String getFax() {
		return fax;
	}
	public void setFax(String fax) {
		this.fax = fax;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}	
}
O problema também está no HQL. Fiz algumas correções e tá dando erro aí
R

@Entity @Table(name = "clientes", catalog = "teste") public class Clientes implements java.io.Serializable {

olha um exemplo de mapeamento!
tem escola.hbm? no hibernate.cfg ta esse mapeamento associado?

P

Comecei a mapear as coisas por aqui e agora veja o novo erro. Mas ainda não resolvi a questão do SQL ou HQL. Não sei como passar SQL por classes mapeadas.

P
Implementei esse código e agora funciona no console.
Query query =  getEntityManager().createQuery("select esc.nome from Escola esc");    
	         return (List&lt;Escola&gt;) query.getResultList();

Porem quando eu chamo na página, dá erro de NullPointerException. Veja o código de chamada na página:

E o código dfe chamada na página:
&lt;h:form&gt;
					&lt;p:dataList value="#{mostraEscolaAtiva.escolas}" var="escl" type="ordered"&gt;
					  #{escl.nome}
					&lt;/p:dataList&gt;
						 						 
				&lt;/h:form&gt;
MostraEscolaAtiva é meu ManagedBean(MB)
public class MostraEscolaAtiva implements Serializable{
	private List&lt;Escola&gt; escolas;
	private String nm = "Teste";
	public String getNm() {
		return nm;
	}
	public void setNm(String nm) {
		this.nm = nm;
	}
	public void handleToggle(ToggleEvent event) {  
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fieldset Toggled", "Visibility:" + event.getVisibility());    
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    } 		
	public List&lt;Escola&gt; getEscolas() {
		if(escolas.size() == 0){    
            escolas = new ListaEscola().findAll();
            if(escolas.size() &gt; 0){
            	System.out.println(escolas.size());
            }else{
            	System.out.println(&quot;A lista está vazia&quot;);
            }	
        }   
            return escolas;
	}
	public void setEscolas(List&lt;Escola&gt; escolas) {
		this.escolas = escolas;
	}
}
R

esse managed bean ta com akela declaração?

@ManagedBean
@ViewScoped

P

@ManagedBean(name=“MostraEsc”)
@SessionScoped

Não usei o ViewScoped
Tá uma zica danada aqui. Só dá NullPointerException.

P

O log do GlassFish

Caused by: java.lang.NullPointerException

at br.com.mosaicodigital.controller.MostraEscolaAtiva.getEscolas(MostraEscolaAtiva.java:40)

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

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

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

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

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

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:116)

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

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

at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)

… 42 more

AVISO: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
at br.com.mosaicodigital.controller.MostraEscolaAtiva.getEscolas(MostraEscolaAtiva.java:40)

P

O que eu acho estranho é que se eu rodar no console(Java Application), eu consigo trazer a lista de escola, usando as mesmas coisas.

Criado 4 de maio de 2011
Ultima resposta 6 de mai. de 2011
Respostas 23
Participantes 2