Carregar objetos no selectonemenu

259 views
Skip to first unread message

Dionatan Hovoruski

unread,
Sep 21, 2011, 6:52:23 PM9/21/11
to javasf: JavaServer Faces Group
Estou tentando carregar o selectonemenu porém o mesmo está retornando
o erro.

Se eu uso o conversor os campos não são preenchidos.
Se não uso, os itens são preenchidos mais no salvar acontece um erro
de conversão.

Alguem tem alguma dica do que pode ser?


Desde já agradeço...


ERRO:

21/09/2011 19:19:06 com.sun.faces.context.PartialViewContextImpl
$PhaseAwareVisitCallback visit
SEVERE: java.lang.ClassCastException: java.lang.String cannot be cast
to br.com.webscola.model.bean.Aluno


CODIGO NA VIEW:

<h:selectOneMenu id="Aluno" value="#{matriculaController.aluno}"
style="width: 300px;" converter="alunoconversor"
requiredMessage="O campo Aluno é de
preenchimento obrigatório">
<f:selectItem itemLabel="Selecione o Aluno" itemValue=""/>
<f:selectItems value="#{alunoController.alunos}" var="aluno"
itemLabel="#{aluno.nome}" itemValue="#{aluno} "/>
</h:selectOneMenu>

MEU CONVERSOR:

@FacesConverter("br.com.webscola.util.AlunoConversor")
public class AlunoConversor implements Converter {

public Object getAsObject(FacesContext fc, UIComponent uic, String
string) {
if (string.trim().equals("")) {
return null;
} else {
try {
Integer number = Integer.parseInt(string);

Session session =
HibernateUtil.getSessionFactory().openSession();
InterfaceDAO<Aluno> alunoDAO = new
HibernateDAO<Aluno>(Aluno.class, session);
Aluno aluno = new Aluno();

aluno = alunoDAO.getBean(number);
session.close();
if (aluno != null) {
return aluno;
}

} catch (NumberFormatException exception) {
throw new ConverterException(new
FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro de Conversão", "Não é
um aluno válido!"));
}
}
return null;
}

public String getAsString(FacesContext fc, UIComponent uic, Object
o) {
if (o == null || o.equals("")) {
return "";
} else {
return String.valueOf(((Aluno) o).getId());
}
}
}

Mayara Madeira Trevisol

unread,
Sep 22, 2011, 7:23:16 AM9/22/11
to javasf: JavaServer Faces Group
Olá Dionatan,

da uma olhada nesse tópico, acredito que irá te ajudar nesse problema:

http://www.guj.com.br/java/218384-erro-de-converte---jsf-20-resolvido---agora-duvida-com-conceito-de-model-do-cdi-weld

Abs,

Mayara Madeira Trevisol

Mayara Madeira Trevisol

unread,
Sep 22, 2011, 7:35:27 AM9/22/11
to javasf: JavaServer Faces Group
Oi Dionatan,

olhei com mais calma seu código e vi que voce carrega as opções do
componente dessa forma:
<f:selectItems value="#{alunoController.alunos}" var="aluno"
itemLabel="#{aluno.nome}" itemValue="#{aluno} "/>

esse atributo alunos do teu controle, é uma lista de alunos ou uma
lista de SelectItem?

quando monto dinamicamente um SelectOneMenu eu faço da seguinte forma:

MBean:

public void populaSessao() {
this.sessoesSi = new ArrayList<SelectItem>();

List<AreaTrabalho> listagem =
areaTrabalhoEjb.buscarPorFiltro(filtro);

for (AreaTrabalho at : listagem) {
SelectItem si = new SelectItem(at.getCodigoSecao(),
at.getDescricao());
this.sessoesSi.add(si);
}
}

XHTML:

<h:outputText value="Seção:"/>
<h:selectOneMenu id="selSessoes"
value ="#{areaTrabalhoMBean.filtro.codigoSecao}"
style="width: 500px">

<f:selectItem itemValue="" itemLabel="Selecione" />
<f:selectItems id="itemSessoes" itemLabelEscaped="false"
value="#{areaTrabalhoMBean.sessoesSi}" />
</h:selectOneMenu>

note que no meu caso, eu nao digo quem é o itemLabel nem itemValue no
componente <f:selectItems pois faço isso na montagem da lista de
SelectItens.

tente adaptar o teu para ver se não é esse o motivo de ele nao
carregar...

Abs,

Mayara Madeira Trevisol

Dionatan Hovoruski

unread,
Sep 22, 2011, 7:57:01 AM9/22/11
to javasf: JavaServer Faces Group
Bom dia Mayara

Eu estava fazendo desta maneira. Porém, cada vez que precise salvar
meu item tenho que obter o bean do meu item selecionado para setar no
meu objeto que será persistido e isto não é nada prático.

O modo como você estava fazendo era muito utilizado na versão 1.2 do
JSF. Apartir do JSF 2 surgiu este modo de trabalhar diretamente com os
objeto, porém no meu caso não está funcionando.

On Sep 22, 8:35 am, Mayara Madeira Trevisol <mayara...@gmail.com>
wrote:

Mayara Madeira Trevisol

unread,
Sep 22, 2011, 8:09:05 AM9/22/11
to javasf: JavaServer Faces Group
Oi Dionatan,

Não conhecia essa facilidade do JSF 2, bem interessante.

quanto a recuperar o bean, não fui muito feliz no exemplo que te
passei. Mas onde eu tenho value
="#{areaTrabalhoMBean.filtro.codigoSecao}" eu costumo usar dessa
forma value ="#{areaTrabalhoMBean.sessaoSelecionada}"

Utilizando o converter, ele faz essa recuperação do bean que setei
anteriormente no Value do SelectItem.

então na montagem da lista, eu usaria assim: SelectItem si = new
SelectItem(at,
at.getDescricao());

Mas essa pratica eu trago do Jsf 1.2

Abs,

Mayara Madeira Trevisol.

Mayara Madeira Trevisol

unread,
Sep 22, 2011, 8:25:04 AM9/22/11
to javasf: JavaServer Faces Group
Aqui está o exemplo que eu devia ter enviado da primeira vez:

XHTML:

<h:outputLabel id="lblInstituicao"
value="Instituição"/>
<h:selectOneMenu id="selInstituicoes"
value ="#{loginMBean.instituicaoSelecionada}"
style="max-width: 300px"
required="true"
converter="IndexedConverter"
requiredMessage="Campo instituição obrigatório">
<f:selectItems id="itemInstituicoes" itemLabelEscaped="false"
value="#{loginMBean.instituicoesSi}"
itemDescription="aaa"/>
</h:selectOneMenu>

MBean:

private List<SelectItem> instituicoesSi;
private Instituicao instituicaoSelecionada;
//...
public void carregaCampoInstituicoes() {

this.instituicoesSi = new ArrayList<SelectItem>();

List<Instituicao> instituicoesLst =
instituicaoEjb.buscarInstituicoesUsuario(usuario);

if (instituicoesLst != null && !instituicoesLst.isEmpty()) {

for (Instituicao inst : instituicoesLst) {
SelectItem si = new SelectItem(inst, inst.getNomeInstituicao());
this.instituicoesSi.add(si);
}
}

}

public Instituicao getInstituicaoSelecionada() {
return instituicaoSelecionada;
}

public void setInstituicaoSelecionada(Instituicao
instituicaoSelecionada) {
this.instituicaoSelecionada = instituicaoSelecionada;
}

public List<SelectItem> getInstituicoesSi() {
return instituicoesSi;
}

public void setInstituicoesSi(List<SelectItem> instituicoes) {
this.instituicoesSi = instituicoes;
}

Converter:
//...
@FacesConverter(value = "IndexedConverter")
public class IndexedConverter implements Converter {

private int index;

public Object getAsObject(FacesContext facesContext, UIComponent
uicomp, String value) {
List<SelectItem> items = new ArrayList<SelectItem>();
List<UIComponent> uicompList = uicomp.getChildren();
for(UIComponent comp: uicompList){
if(comp instanceof UISelectItems){
items.addAll((List<SelectItem>)
((UISelectItems)comp).getValue());
}
}
return "-1".equals(value) ? null :
items.get(Integer.valueOf(value)).getValue();
}

public String getAsString(FacesContext facesContext, UIComponent
uicomp, Object entity) {
return entity == null ? "-1" : String.valueOf(index++);
}
}

Abs,

Mayara Madeira Trevisol.

Jonas Bertolino

unread,
Sep 22, 2011, 8:53:52 AM9/22/11
to jav...@googlegroups.com
@Dionatan, segue no pastebin um código que montei essa semana, e que está funcional:

http://pastebin.com/zUP3XdZi

Nele está  o conversor, o bean e o xhtml, parcialmente.

   }
}

 Abs,

 Mayara Madeira Trevisol.

--
Você recebeu esta mensagem por que é membro do  Javasf
http://groups.google.com/group/javasf

Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil

Altieres de Matos

unread,
Sep 22, 2011, 10:32:33 AM9/22/11
to jav...@googlegroups.com
Segue um exemplo que fiz:
 
 
Att Altieres de Matos

Mayara Madeira Trevisol

unread,
Sep 22, 2011, 10:45:10 AM9/22/11
to javasf: JavaServer Faces Group
@Altieres e @Jonas

ótimos exemplos, obrigada por compartilhar.

estava mudando o meu componente para trabalhar com o formato novo mas
me deparei com uma dificuldade.
o exemplo de voces, o converter utiliza um objeto DAO, no meu projeto
usamos EJB... como eu poderia adaptar o converter para usar meu
sessionBean?

tentei com @Ejb mas ele nao instanciou e instanciando na mão também
nao funciona.

Reply all
Reply to author
Forward
0 new messages