selectOneMenu dinâmico gera erro

5 respostas
riccarsan

Poderiam me ajudar?
Estou tentando fazer um selectOneMenu dinâmico a nível de estudo mesmo, mas está dando um erro. Seria por que eu não estou inserindo a propriedade sigla no maneged bean? Devo inserir a propriedade sigla dentro do construtor como fiz com a lista? Se sim como faço? Deve inserir uma variável definindo a sigla para cada pais que eu insiro na no arraylist?

O erro que dá no browser:

type Exception report

message

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

exception

javax.servlet.ServletException: /Pagina.xhtml @20,29 itemValue="#{pais.sigla}": The class ‘java.lang.String’ does not have the property ‘sigla’.
root cause

javax.el.PropertyNotFoundException: /Pagina.xhtml @20,29 itemValue="#{pais.sigla}": The class ‘java.lang.String’ does not have the property ‘sigla’.
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.1.2 logs.

Segue o arquivo xhtml:

<h:head>
Componentes_Visuais
</h:head>
<h:body>
<h:form>

<h:selectOneMenu value="#{testeBean.siglaDoPais}">
		<f:selectItems value="#{testeBean.paises}" var="pais"
			itemValue="#{pais.sigla}" itemLabel="#{pais.nome}" />

	</h:selectOneMenu>

</h:form>

</h:body>

segue o Bean:

import java.util.*;

import javax.faces.bean.ManagedBean;

@ManagedBean
public class TesteBean {

private String siglaDoPais;
private List<String> paises = new ArrayList<String>();

public TesteBean() {

	paises.add("Argentina");
	paises.add("Brasil");
	paises.add("United Kingdon");
	paises.add("França");
}

public List<String> getPaises() {
	return paises;
}

public void setPaises(List<String> paises) {
	this.paises = paises;
}

public String getSiglaDoPais() {
	return siglaDoPais;
}

public void setSiglaDoPais(String siglaDoPais) {
	this.siglaDoPais = siglaDoPais;
}

}

classe Pais:

public class Pais {

private String sigla;

private String nome;
public Pais(String sigla, String nome) {
	super();
	this.sigla = sigla;
	this.nome = nome;
}
public String getSigla() {
	return sigla;
}
public void setSigla(String sigla) {
	this.sigla = sigla;
}
public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}

5 Respostas

Z

Cara, trabalha com SelectItem no seu bean.
Cria na mão e adiciona os selectItens a uma lista de SelecItem e aponta sua combo para ela.

do tipo: selectItem = new SelectItem(pais.nome, pais.nome);

Ai vc cria no bean o método que recebe os valuesChange da combo e pega o valor assim:
String pais = (String)event.getNewValue();

Espero q ajude.

E

exato , segue o que o zz falou, vc nao pode passar String para um SelectOnMenu direto, precisa tratar
para virar um SelectItem ok.

E
Boa noite riccarsan. A mensagem de erro diz que não foi possível encontra a propriedade 'sigla' na classe String. Você criou uma classe Pais, mas no seu managedBean criou um List de String
private List<String> paises = new ArrayList<String>();
Pode muda por:
private List<Pais> paises = new ArrayList<Pais>();
Bom, se deve esta testando JSF2, que pode inserir uma lista de objeto direto em um selectOneMenu.
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core"> 

<h:head> 
<title>Componentes_Visuais</title> 
</h:head> 
<h:body> 
<h:form> 

<h:selectOneMenu value="#{testeBean.pais.sigla}"> 
<f:selectItems value="#{testeBean.paises}" var="pais" 
itemValue="#{pais.sigla}" itemLabel="#{pais.nome}" /> 
</h:selectOneMenu> 

</h:form> 
</h:body> 
</html> 

segue o Bean: 
import java.util.*; 
import javax.faces.bean.ManagedBean; 

@ManagedBean 
public class TesteBean { 

private Pais pais; 
private List<Pais> paises = new ArrayList<Pais>(); 

public TesteBean() { 
paises.add(new Pais("ARG","Argentina")); 
paises.add(new Pais("BR","Brasil")); 
paises.add(new Pais("UK","United Kingdon")); 
paises.add(new Pais("FR","França")); 
pais = new Pais();
} 

public List<Pais> getPaises() { 
return paises; 
} 

public void setPaises(List<Pais> paises) { 
this.paises = paises; 
} 

public String getPais() { 
return pais; 
} 

public void setPais(Pais pais) { 
this.pais = pais; 
} 
} 

classe Pais: 

public class Pais { 
private String sigla; 
private String nome; 

public Pais(){
}

public Pais(String sigla, String nome) { 
super(); 
this.sigla = sigla; 
this.nome = nome; 
} 
public String getSigla() { 
return sigla; 
} 
public void setSigla(String sigla) { 
this.sigla = sigla; 
} 
public String getNome() { 
return nome; 
} 
public void setNome(String nome) { 
this.nome = nome; 
} 
}
Espero que ajude.
riccarsan

Bom dia Edson!

Agora funcionou eu estava cometendo o erro que você falou, eu pensava que era só inserir na lista os países como nome de Strings, mas na verdade tinha que inserir a lista de objetos, mas como você citou o JSF2 permite inserir direto a lista de objetos no selectOneMenu, mas existem outras especificações que não permite? Aí tem que fazer diferente?
Não querendo abusar, mas a última linha do construtor : pais = new Pais(“PT”,“Portugal”); eu sacando-a ou deixando-a no Bean aparentemente não muda o resultado… Tem alguma finalidade essa linha que eu não consegui identificar?

E

Boa tarde riccarsan.
Pode ser feito como foi postado anteriomente, usado o SelectItem no seu bean.
Referente a linha:

pais = new Pais();

Ela somente inicializa o objeto para não ficar com o valor null.
O seu exemplo: pais = new Pais(“PT”,“Portugal”);
Você deve adiciona ele a lista de objeto para que este apareca no seu selectOneMenu.
Exemplo:

public TesteBean() { paises.add(new Pais("ARG","Argentina")); paises.add(new Pais("BR","Brasil")); paises.add(new Pais("UK","United Kingdon")); paises.add(new Pais("FR","França")); paises.add(new Pais("PT","Portugal")); pais = new Pais(); }
Espero que ajude.

Criado 23 de julho de 2012
Ultima resposta 25 de jul. de 2012
Respostas 5
Participantes 4