[Resolvido] Ajuda com property (JSF)

Olá…

Estou pelejando em JSF e não estou conseguindo entender o motivo do código não funcionar


 /index.xhtml @10,80 value="#{usuarioController.listarUsuarios}": Property 'listarUsuarios' not found on type br.com.self.controller.UsuarioController

Se alguém puder me ajudar nessa ficarei grato. Lembrando também que existem camadas mais profundas (Hibernate) porém o problema está realmente no controller que supostamente não contém a propriedade ?!?!?!?

@ManagedBean
@SessionScoped
public class UsuarioController {
	
	private Usuario usuario ;
	private DataModel<Usuario> listaUsuarios ;
	
	
	public DataModel<Usuario> getListaUsuarios() {
		List<Usuario> lista = new UsuarioDAOImpl().list() ;
		System.out.println("!!!");
		listaUsuarios = new ListDataModel<Usuario>(lista) ;
		return listaUsuarios ;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
}

Aqui o code do xhtml que está acessando o bean


<!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> 
	<h1>Teste do dataTable</h1>
	<h:dataTable value="#{usuarioController.listarUsuarios}" var="listaUsuarios" >
		<h:column>
			<f:facet name="header">
				<h:outputText value="#{listaUsuarios.login}"/>
			</f:facet>
		</h:column>
	</h:dataTable>
</h:body> 
</html>

private Usuario usuario = new Usuario(); (get e set) private UsuarioDaoImpl dao = new UsuarioDaoImpl(); (get e set)
veja como ficou

public DataModel<Usuario> getListaUsuarios() { List<Usuario> lista = dao.list(); System.out.println("!!!"); listaUsuarios = new ListDataModel<Usuario>(lista) ; return listaUsuarios ;
}

Acho que pude não ter sido objetivo para exemplificar o problema, portanto…

Este é apenas um teste que estou fazendo para estudar JSF, cheguei a compor várias classes @ManagedBean porém sem utilização da persistência dentro do código do bean muito menos com elementos Collections

infelizmente esse não consegui por para funcionar…

esse bean deveria chamar um DAO para persistir o objeto Usuario (acho que talvez essa camada nem venha ao caso)

o jsf diz não conseguir acessar a property descrita acima… porém ela está lá, n consigo entender pois, quando eu não declaro o bean o erro informado é NullPointerException dizendo que o tipo não existe ou não foi encontrato e quando eu declaro ele diz que a propriedade não existe…

Ja perdi alguns fios de cabelo aqui (os poucos que me restam)

o que vc tem nessa classe

UsuarioDaoImpl ?
cole ai

[quote=tmvolpato]private Usuario usuario = new Usuario(); (get e set) private UsuarioDaoImpl dao = new UsuarioDaoImpl(); (get e set)
[/quote]

Vou verificar, ja retorno (mas não intendi direito o pq tenho que transportar um identificador do meu dao para dentro do bean), poderia explicar?
vou testar e ja retorno

se é só para teste usa os exemplos
que tem la no site do prime
que não utiliza camada dao
apenas cria uma lista no proprio ManagedBean para popular o datable de exemplo

Desculpe se não coloquei a totalidade do código, achei que não seria relevante para isto
1º o contrato do DAO

package br.com.self.dao;

import java.util.List;

import br.com.self.model.Usuario;

public interface UsuarioDAO {
	public  abstract void insert(Usuario usuario) ;
	public  abstract void update(Usuario usuario) ;
	public  abstract Usuario get(String login) ;
	public  abstract void remove(Usuario usuario) ;
	public  abstract List<Usuario> list() ;
}

2º a implementação dele

package br.com.self.dao;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.self.model.Usuario;
import br.com.self.utils.ConnectHibernateFactory;

public class UsuarioDAOImpl implements UsuarioDAO {
	private Session session ;
	@Override
	public void insert(Usuario usuario) {
		session = ConnectHibernateFactory.getInstance() ;
		Transaction tx = null ;
		try {
			tx = session.beginTransaction() ;
			session.save(usuario) ;
			tx.commit() ;
		} catch (HibernateException he) {
			he.printStackTrace() ;
			tx.rollback() ;
		} finally {
			session.close() ;
		}
		
	}

	@Override
	public void update(Usuario usuario) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Usuario get(String login) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void remove(Usuario usuario) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public List<Usuario> list() {
		// TODO Auto-generated method stub
		return null;
	}

}

a sessionfactory

package br.com.self.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class ConnectHibernateFactory {
	private static final SessionFactory sessionFactory ;
	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>() ;
	
	static {
		try {
			sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory() ;
		} catch (Throwable t) {
			throw new ExceptionInInitializerError(t) ;
		}
	}
	
	public static Session getInstance() {
		Session session = (Session) threadLocal.get() ;
		session = sessionFactory.openSession() ;
		threadLocal.set(session) ;
		return session ;
	}
}

O bean


package br.com.self.controller;


import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import br.com.self.dao.UsuarioDAOImpl;
import br.com.self.model.Usuario;

@ManagedBean
@SessionScoped
public class UsuarioController {
	
	private Usuario usuario ;
	private DataModel<Usuario> listaUsuarios ;
	
	
	public DataModel<Usuario> getListaUsuarios() {
		List<Usuario> lista = new UsuarioDAOImpl().list() ;
		System.out.println("!!!");
		listaUsuarios = new ListDataModel<Usuario>(lista) ;
		return listaUsuarios ;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
}

PS: Não tenho o bean mapeado no faces-config.xml nem absolutamente nada lá, meu web.xml tenho 99% de certeza que não esta causando o problema em todo caso aqui vai ele

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>JSFProject_WithHibernate</display-name>
	<welcome-file-list>
		<welcome-file>index.jsf</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
	</servlet-mapping>
	<context-param>
		<param-name>javax.faces.CONFIG_FILES</param-name>
		<param-value>
  			/WEB-INF/faces-config.xml,
  			/WEB-INF/beans.xml,
  			/WEB-INF/navigation.xml,
  		</param-value>
  		</context-param>
		<context-param>
			<description>State saving method: 'client' or 'server' (=default).
				See JSF Specification 2.5.2</description>
			<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
			<param-value>client</param-value>
		</context-param>
		<context-param>
			<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
			<param-value>resources.application</param-value>
		</context-param>
		<listener>
			<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
		</listener>
		
</web-app>

[quote=tmvolpato]se é só para teste usa os exemplos
que tem la no site do prime
que não utiliza camada dao
apenas cria uma lista no proprio ManagedBean para popular o datable de exemplo[/quote]
Aí você me mata! rsrs, estou fazendo assim pq quero aprender cara! Eu ainda to na era do <%%> e do <%= %> (vergonha né!)

[quote=tmvolpato]se é só para teste usa os exemplos
que tem la no site do prime
que não utiliza camada dao
apenas cria uma lista no proprio ManagedBean para popular o datable de exemplo[/quote]
Site do prime?
Seria o que? primefaces?

Posso estar completamente errado! de uma ou outra forma sei que estarei!

mas enfim, sob meu ponto de vista, o DAOImpl o DAO (interface) o hibernate e etc a + que estiver nas camadas abaixo não estão nem sendo executados pq o tomcat está alegando que a propriedade do bean declarado por (@ManagedBean) não existe

Ja tentei declarar o bean no faces-config.xml mas o erro persistiu

Edição:
Como não estou seguindo nenhum tutorial disponível e fazendo tudo na unha pode ser que eu não tenha percebido algo no código

[quote=eduardo.exs][quote=tmvolpato]se é só para teste usa os exemplos
que tem la no site do prime
que não utiliza camada dao
apenas cria uma lista no proprio ManagedBean para popular o datable de exemplo[/quote]
Site do prime?
Seria o que? primefaces?[/quote]

isso msm mania de fala apenas prime kk

exemplo basico
http://www.codesample.co/tag/primefaces-3-2-jsf2/

ele usa @Named mas vc pode Manter o @ManagedBean mesmo

qlqr duvida posta ai

cara o exemplo que vc citou o cara lá utiliza alguns conceitos que ainda não vi e sinceramente ja vi exemplos de pessoas que fizeram o CRUD sob a mesma perspectiva que estou tentando fazer, posso até ter pecado quanto à engenharia e padrões de projeto mas que ja vi rodando ja vi

@PostConstruct
public void init(){

por exemplo, eu preciso de algo pra inicializar o bean? um construtor ou esse init()?
ou simplesmente chamando a sua propriedade ele adota os procedimentos para isso?

[quote=eduardo.exs]cara o exemplo que vc citou o cara lá utiliza alguns conceitos que ainda não vi e sinceramente ja vi exemplos de pessoas que fizeram o CRUD sob a mesma perspectiva que estou tentando fazer, posso até ter pecado quanto à engenharia e padrões de projeto mas que ja vi rodando ja vi

@PostConstruct
public void init(){

por exemplo, eu preciso de algo pra inicializar o bean? um construtor ou esse init()?
ou simplesmente chamando a sua propriedade ele adota os procedimentos para isso?[/quote]

Ele fez isso para que lista seja carregada com os valores passados
não precisa fazer isso, só qdo vc quer que certos dados seja carregado ao inicializar o bean

é o nome mais usado para esse nome de método
mas vc pode colocar outro seguindo o padrao

O que eu preciso é apenas “conseguir” fazer o xhtml colocar os dados na dataTable que vieram do hibernate…

tanto que neste teste que fiz não cheguei a “terminar” a dataTable, apenas gostaria de conferir se estava funcionando… infelizmente me dei mal…

E ja estou ficando muito chateado cara, pq toda vez que trabalho com o Bean JSF sem persistência, tudo é lindo, tudo funciona etc… inclusive a dataTable

e qdo vou mexer com o hibernate minha vida vira um inferno… infelizmente nos ultimos meses eu resolvi interrar de vez o jdbc senão vou acabar ficando sem emprego :slight_smile:

Fala eduardoexs…

Mude seu index.xhtml para:

  <h:dataTable value="#{usuarioController.listaUsuarios}" var="listaUsuarios" >  

O “JSF” não achou sua propriedade, no seu caso um getListaUsuarios, por ter um r no .xhtml e no MB não.

Até…

[quote=juliannoms]

Mude seu index.xhtml para:

  <h:dataTable value="#{usuarioController.listaUsuarios}" var="listaUsuarios" >  

Até…[/quote]

Te devo um café!
E olha que olhei e olhei e olhei de novo… de tanta raiva até cego a gente fica!
Abraços

Tem um outro lance que talvez alguem me ajude de quebra…

eu usava o eclipse Indigo aí fui pro Juno (odiei, pelo menos enquanto não tiver máquina pra rodar ele, achei ele terrívelmente pesado) e agora vortei pro Helios, e meu Helios não completa o código EL (Tem como resolver via plugin ou config ou é da versão msm)?