Como popular um combobox/selectOneListbox via banco de dados em JSF?

8 respostas
A

Boa Noite Caros!

Estou tendo problemas em popular o combobox na pagina web, por min está tudo certo, entretanto ele mostra
esse erro: HTTP Status 500 - /cadastro_jogador.xhtml @41,45 value="#{jogadorBean.listaTimes}": Property 'listaTimes' not found on type futebol.bean.JogadorBean.

Eu segui esse tutorial aqui: http://www.arquivodecodigos.net/dicas/jsf-java-server-faces-como-preencher-um-controle-hselectonemenu-com-informacoes-de-uma-tabela-do-banco-de-dados-3148.html , nesse tutorial ele mostra passo a passo como compor um combox, mas comigo não deu muito certo.

Obs.: Eu utilizei hibernate, no entanto eu testei via console, e ele está funcionado corretamente.

O código pode ser visualizado abaixo:

//BEAN//
package futebol.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import futebol.entities.JogadorEntity;
import futebol.entities.TimeEntity;
import futebol.repository.JogadorRepository;
import futebol.repository.TimeRepository;

@ManagedBean
public class JogadorBean implements Serializable {

	TimeEntity time = new TimeEntity();

	private static final long serialVersionUID = 1L;
	private String nome;
	private int idade;
	private float altura;
	private TimeEntity time_id;
	
	public JogadorBean()
	{
		
	}

	public List<TimeEntity> getTimes() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("futebol");
		EntityManager gerenciador = factory.createEntityManager();
		List<TimeEntity> listaTimes = new ArrayList<TimeEntity>();
		try {

			TimeRepository tr = new TimeRepository(gerenciador);
			for (TimeEntity obj : tr.buscaTodos()) {
				listaTimes.add(obj);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			gerenciador.close();
			factory.close();
		}
		return listaTimes;
	}

	public void cadastrarJogador() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("futebol");
		EntityManager gerenciador = factory.createEntityManager();
		try {
			JogadorEntity jogador = new JogadorEntity();
			jogador.setNome(nome);
			jogador.setIdade(idade);
			jogador.setAltura(altura);
			jogador.setTime(time);

			JogadorRepository jr = new JogadorRepository(gerenciador);

			gerenciador.getTransaction().begin();

			jr.adiciona(jogador);

			gerenciador.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			factory.close();
			gerenciador.close();
		}
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getIdade() {
		return idade;
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}

	public float getAltura() {
		return altura;
	}

	public void setAltura(float altura) {
		this.altura = altura;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public TimeEntity getTime_id() {
		return time_id;
	}

	public void setTime_id(TimeEntity time_id) {
		this.time_id = time_id;
	}

}

//PaginaWeb//

<?xml version="1.0" encoding="ISO-8859-1" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" version="2.0">
    <jsp:directive.page language="java"
        contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" />
    <jsp:text>
        <![CDATA[ <?xml version="1.0" encoding="ISO-8859-1" ?> ]]>
    </jsp:text>
    <jsp:text>
        <![CDATA[ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ]]>
    </jsp:text>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Cadastro de Jogador</title>
</head>
<body>
<f:view>
	<h:form>
			<center>
				<table>
					<caption><p style="font-weight:bold; font-size: 22px; align-text:center; ">Cadastro de jogador:</p></caption>
					<tr>
						<td><h:outputLabel value="Nome:" for="txtNome" /></td>
						<td><h:inputText maxlength="50" value="#{jogadorBean.nome}" id="txtNome" /></td>
					</tr>
					<tr>
						<td><h:outputLabel value="Idade:" for="txtIdade" /></td>
						<td><h:inputText maxlength="4" value="#{jogadorBean.idade}" id="txtIdade" /></td>
					</tr>
					<tr>
						<td><h:outputLabel value="Altura:" for="txtAltura" /></td>
						<td><h:inputText maxlength="5" value="#{jogadorBean.altura}" id="txtAltura" /></td>
					</tr>
					<tr>
						<td>
							<h:selectOneListbox id="times" value="#{jogadorBean.time_id}">
								<f:selectItems value="#{jogadorBean.listaTimes}"
									var="jogadorEntity"
									itemValue="#{jogadorEntity.id}"
									itemLabel="#{jogadorEntity.nome}"/>
							</h:selectOneListbox>		
						</td>
					</tr>
					<tr>
						<td>
						<h:commandButton value="Salvar Jogador" action="#{jogadorBean.cadastrarJogador}" />
						<br />
						</td>
					</tr>
				</table>
			</center>
	</h:form>

	

</f:view>
</body>
</html>
</jsp:root>

Achei um tutorial na internet para adicionar a tag no faces-config.xml com as classes bean, mas quando eu coloco esse código lá, aparece esse:
"vc-complex-type.2.4.b: The content of element 'managed-bean' is not complete. One of '{"http://java.sun.com/
xml/ns/javaee":description, "http://java.sun.com/xml/ns/javaee":display-name, "http://java.sun.com/xml/ns/
javaee":icon, "http://java.sun.com/xml/ns/javaee":managed-bean-name}' is expected."

Achei em um outro forum, falando que precisa ser um atributo para a tag para popular o combobox, onde precisa ter o getter e setter, mas desconsiderei esse post, pois
achei um tutorial que uma pessoa utilizou list para popular e outra que não pensei em nenhuma ideia com uma lógica adequada até o exato momento presente para solucionar isso.

Dessa forma, fico sem nenhuma ideia para resolver meu problema.

Alguém teve alguma ideia ou teve um problema semelhante?

Muito obrigado,

Att, André Vieira.

8 Respostas

I

como diz o erro:

lá no seu JogadorBean ta faltando um:

private List listaTimes;

getters e setters dele

F

crie o atributo da lista:

private List&lt;Time&gt; listaTimes = new ArrayList&lt;Time&gt;();   // se sua entidade de times chamar times

e crie os getters e setters

ai crie um método para popular esta lista como por ex:

@PostConstruct
public void populateListaTimes(){
   listaTimes = timeService.getTimes();
}
A

fabiozanardi:
crie o atributo da lista:

private List&lt;Time&gt; listaTimes = new ArrayList&lt;Time&gt;();   // se sua entidade de times chamar times

e crie os getters e setters

ai crie um método para popular esta lista como por ex:

@PostConstruct public void populateListaTimes(){ listaTimes = timeService.getTimes(); }

O que seria esse timeService? O combobox/selectOneListbox ainda está vazio, olha como eu fiz:

private List&lt;TimeEntity&gt; lista = new ArrayList&lt;TimeEntity&gt;();
public List&lt;TimeEntity&gt; getTimes() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("futebol");
		EntityManager gerenciador = factory.createEntityManager();
		List&lt;TimeEntity&gt; listaTimes = new ArrayList&lt;TimeEntity&gt;();
		try {

			TimeRepository tr = new TimeRepository(gerenciador);
			for (TimeEntity obj : tr.buscaTodos()) {
				listaTimes.add(obj);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			gerenciador.close();
			factory.close();
		}
		return listaTimes;
	}

public List&lt;TimeEntity&gt; obterLista()
	{
		lista = getTimes();
		return lista;
	}

//Combobox na pagina web//

&lt;h:selectOneListbox id="times" value="#{jogadorBean.time_id}"&gt;
								&lt;f:selectItems value="#{jogadorBean.lista}"
									var="jogadorEntity"
									itemValue="#{jogadorEntity.id}"
									itemLabel="#{jogadorEntity.nome}"/&gt;
&lt;/h:selectOneListbox&gt;
A

igor_ks:
como diz o erro:

lá no seu JogadorBean ta faltando um:

private List listaTimes;

getters e setters dele

Primeiramente muito obrigado pela resposta! Eu não entendi como vai ser populado no selectOneListbox,
pois pelo meu teste no console a lista está com dados, olhe abaixo:

// Classe teste
public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		JogadorBean obj = new JogadorBean();
		for(TimeEntity te: obj.getLista())
		{
			System.out.println("Times: "+te.getNome());
		}
	}

//Resultado no console:

Hibernate: 
    select
        timeentity0_.id as id0_,
        timeentity0_.apelido as apelido0_,
        timeentity0_.nome as nome0_ 
    from
        times timeentity0_
3625 [main] INFO  org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl - HHH000030: Cleaning up connection pool [jdbc:mysql://localhost:3306/futebol]
Times: palmeiras
Times: Palmeiras
Times: Palmeiras

Mas o meu selectOneListBox está vindo vazio, e agora, o que fazer?

F

o timeService seria um serviço que você criaria, para popular a sua lista.

por exemplo

public class TimeService{

private List&lt;Time&gt; listTimes = new ArrayList&lt;Time&gt;();

public List&lt;Time&gt; getTimes(){
    
   
   // logica para preencher a lista aqui, exemplo abaixo bem básico supondo que voce já tem uma entidade Time com um construtor que passe apenas o nome do time:

   Time time1 = new Time('Palmeiras');
   Time time2 = new Time('Corinthians');
   listTimes.add(time1);
   listTimes.add(time2);
   
return  listTimes;
}

}

ai no bean, voce popularia a lista chamando esse serviço

A

fabiozanardi:
o timeService seria um serviço que você criaria, para popular a sua lista.

por exemplo

public class TimeService{

private List&lt;Time&gt; listTimes = new ArrayList&lt;Time&gt;();

public List&lt;Time&gt; getTimes(){
    
   
   // logica para preencher a lista aqui, exemplo abaixo bem básico supondo que voce já tem uma entidade Time com um construtor que passe apenas o nome do time:

   Time time1 = new Time('Palmeiras');
   Time time2 = new Time('Corinthians');
   listTimes.add(time1);
   listTimes.add(time2);
   
return  listTimes;
}

}

ai no bean, voce popularia a lista chamando esse serviço

Fiz um teste, como citado post acima então visualizei que minha lista está sendo populada, entretanto ela não está sendo preenchida no selectOneListbox,
sabe ou tem alguma ideia do que pode ser?

Muito obrigado,

Att, André Vieira

F

no managedBean, sua lista listaTimes tem um getter e um setter?

A

Muito obrigado pela resposta. Com a ajuda de um amigo, eu consegui resolver esse:

A solução foi colocar a lista dentro do construtor para popular…

Att, André Vieira.

Criado 24 de setembro de 2012
Ultima resposta 25 de set. de 2012
Respostas 8
Participantes 3