[RESOLVIDO] Seam + h:selectOneMenu

9 respostas
jaumzera

Olá amigos.

Estou tendo problemas com minha aplicação no JBoss Seam 2.0.
Tenho um <h:selectOneMenu> que utiliza um <s:selectItems> para preenche-lo com dados oriundos do banco de dados.
Porém, quando recupero os dados do banco de dados a partir do meu objeto DAO, todos os itens do componente acaba levando a tag “selected=‘selected’”.
No entanto, se eu preencher estaticamente um ArrayList no método que retorna os itens do componente, ele funciona perfeitamente. Alguém já passou por tal problema e saberia me ajudar?

Código que retorna a lista é mais ou menos assim:

public List&lt;MeuObjeto&gt; getSelectItems(){
     return dao.list();
}

Com o código acima, no HTML, todos os <option> são gerados com a tag selected=“selected”.

No entanto, se eu fizer algo como:

public List&lt;MeuObjeto&gt; getSelectItems(){
     ArrayList&lt;MeuObjeto&gt; list = new ArrayList&lt;MeuObjeto&gt;();
     list.add(new MeuObjeto(1, "um"));
     list.add(new MeuObjeto(2, "dois"));
     list.add(new MeuObjeto(3, "tres"));

     return list();
}

…funciona perfeitamente.
Alguma sugestão?

9 Respostas

Alessandro_Lazarotti

Eu acho que no post anterior vc colocou o retorno do método getSelectItems() errado (void?)
Como esta o equals() e hashcode() de suas @Entities ?

Alessandro_Lazarotti

… ahh, e este seu segundo método tbm daria errado, já que esta os 3 objetos com key = 1 (fora o retorno do método de novo)

jaumzera

Alessandro Lazarotti:
Eu acho que no post anterior vc colocou o retorno do método getSelectItems() errado (void?)
Como esta o equals() e hashcode() de suas @Entities ?

Realmente cara, escrevi o exemplo com tanta pressa que nem percebi o erro.
Vou corrigí-lo, mas a dúvida persiste!

jaumzera

Alguém aí pode me ajudar?

felipeguerra

Posta a parta da view…

Alessandro_Lazarotti

Geralmente o problema que vc esta tendo é devido a implementação incorreta do equals() e hashcode() de sua @Entity JPA. Confira esta sobreescrita de método e se não possuir o faça.

[]'s

jaumzera

Já me certifiquei sobre a implementação do hashcode e do equals… o problema é o seguinte:

minha aplicação possui um rich:tabPanel que por sua vez tem duas rich:tab.
A primeira contém o rich:dataTable que lista os dados dos meus objetos e implementa algumas operações como o botão para editar, trocar de status e excluir.
A segunda rich:tab contém o formulário problemático. Nesse formulário, tenho um h:selectOneMenu que possui um s:selectItems do JBoss Seam. O que acontece é que quando vou cadastrar alguma coisa pelo formulário, os itens do h:selectOneMenu ficam todos com o atributo “selected”, no HTML. O conteúdo dessa segunda tab é um arquivo independente, e é incluído na rich:tab através de um a4j:include.

Percebi que deve estar havendo um desentendimento entre o rich:dataTable e o h:selectOneMenu, pois, se eu não listar itens no rich:dataTable ou se eu carregar a somente a página que contém o formulário, o componente parece se comportar de forma conveniente.

Alguém já passou por situação parecida?

jaumzera

Alguém?

jaumzera

Saudações amigos…

Acho que encontrei o problema.

Minha aplicação possui um relacionamento do tipo 1:N entre as tabelas Nivel e Usuário, ou seja, 1 Nível pode ter N Usuários.
Na minha camada View, tenho um rich:tabPanel com duas rich:tab, uma para mostar um rich:dataTable com os dados do Usuário e outra com o formulário para cadastro.
É neste formulário que tenho um h:selectOneMenu com um componente Seam para listar os possíveis Níveis para o Usuário.

O problema estava acontecendo justamente por causa desse relacionamento entre Usuário e Nível. Se eu configurar o relacionamento como LAZY, para carregar os dados conforme a demanda, cada item do h:selectOneMenu leva consigo um atributo “selected”. Entretanto, se o relacionamento for EAGER, tudo funciona normalmente.

Vale ressaltar que o relacionamento configurado como LAZY só gera esse problema se os dois componentes (dataTable e selectOneMenu) estiverem na mesma página. Quando executei o formulário separadamente, o problema não apareceu.

Só não encontrei uma explicação para isso.

Obrigado pela atenção à todos.

Criado 4 de março de 2009
Ultima resposta 7 de mar. de 2009
Respostas 9
Participantes 3