Meu problema é bem estranho: por padrão no combobox vem o item “Selecione…”, e logo após vem “Brasil, “Argentina”, “Uruguai”, etc…
O método ‘paisController.actionCarregaUFs’ deveria ser executado cada vez que eu mudasse o item do combo, só que acontece o seguinte: ao carregar a página, vem listados os países no combo e por default vem o item ‘Selecione…’. Se eu clicar no combo e mudar para ‘Brasil’, o método não executa, porém se eu voltar para o item 'Selecione…” o método é executado. Ele deveria ser executado quando eu mudei para ‘Brasil’! O método só executa quando eu volto para ‘Selecione…’, mudando para qualquer outro item do combo o método não executa!
O que tem de errado? O que eu devo fazer? Por favor, ficarei muito grato se alguém puder me ajudar.
Não… o event=“change” é por padrão caso ele for omitido.
D
DaniloAndrade
esta errado, o padrão é null
veja a pagina 19 do primefaces user guide
J
jonas.cant
Ok, desculpe a informação errada. Colocando o ‘event=“change”’ ou não colocando, dá na mesma (no meu caso). Encontrei aqui no fórum uma pessoa que estava com a mesma situação que a minha, mas pra ele o problema foi resolvido colocando o o escopo do bean como @ViewScoped. O meu bean já está com @ViewScoped e mesmo assim não funciona. O evento só é acionado quando é selecionado o item ‘Selecione…’.
Preciso muito resolver esse problema.
D
DaniloAndrade
tenta coloca o itemLabel e itemValue e faz um teste
J
jonas.cant
Mas o que eu colocaria no “itemLabel” e 'itemValue" já que estou usando uma lista de SelecItem? O SelecItem já tem “dentro” dele o “itemLabel” e “itemValue”.
P.S.: tentei colocar o “itemLabel” e “itemValue” com vazio e não funcionou.
D
DaniloAndrade
não esta aparecendo nada no seu log?
J
jonas.cant
Acredito que não tenha nada a ver com o meu problema, mas quando eu reinicio o server, dá a seguinte exceção:
Mas como nunca usei com o objeto SelectItem, posso ta falando besteira.
Abraço.
J
jonas.cant
O SelectItem já possui o itemLabel e itemValue.
Repare o código que estou usando:
publicList<SelectItem>getListarPaisesCombo(){
List<SelectItem>listaCombo=newArrayList<SelectItem>();List<Pais>lista=newPaisDaoImp().list();PaisDaopd=newPaisDaoImp();for(inti=1; i <= lista.size(); i++) {SelectItemitem=newSelectItem(); item.setLabel(lista.get(i-1).getNome()); item.setValue(lista.get(i-1));listaCombo.add(item);}
returnlistaCombo;}
J
jhoamaral
Você esta setando o objeto Pais direto no sectItem, mas não especificou nenhum Converter. Acredito que tenha que criar um Converter para suas classes.
Não está aparecendo nenhum erro no console?
J
jonas.cant
Não utilizo Converter. O código abaixo supostamente substituiria o conversor, pois estou passando um SelectItem:
publicList<SelectItem>getListarPaisesCombo(){
List<SelectItem>listaCombo=newArrayList<SelectItem>();List<Pais>lista=newPaisDaoImp().list();PaisDaopd=newPaisDaoImp();for(inti=1; i <= lista.size(); i++) {SelectItemitem=newSelectItem(); item.setLabel(lista.get(i-1).getNome()); item.setValue(lista.get(i-1));listaCombo.add(item);}
returnlistaCombo;}
E não aparece nenhuma mensagem de erro. O SelectOneMenu espera um objeto do tipo Pais, e é isso que os itens estão devolvendo.
J
jonas.cant
Alguém com mais alguma sugestão? Estou a ponto de largar de mão e partir pra outra linguagem…
J
jhoamaral
Desconheço o fato de não precisar de Converter quando se utiliza uma lista de SelectItem, tem certeza disso?
Qual o servidor de aplicação que vc está utilizando? Pode ser um problema da configuração do log no servidor não está sendo exibida mensagem de erro.
Você evita um for dentro do código pra popular os SelectItems.
J
juno.rr
Meu, olha só, tentei simular o problema aqui e o que descobri é que não funciona se vc setar o objeto Pais no controlador, vc precisa setar uma String e através dela encontrar o Pais correspondente.
Provavelmente é o que o outro colega falou, ta faltando um converter.
Segue o código q usei pra fazer funcionar:
<?xmlversion='1.0'encoding='UTF-8'?><!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"xmlns:h="http://java.sun.com/jsf/html"xmlns:p="http://primefaces.org/ui"xmlns:f="http://java.sun.com/jsf/core"><h:body><h:head><styletype="text/css">#select {position:relative;top:8px;}#paisOutput {border:1pxsolidblack;width:200px;}</style></h:head><h:formprependId="false"id="form1"><p:panelheader="Selecione um país"><p:outputLabelid="label"for="select"value="País:"/><p:selectOneMenuvalue="#{paisController.selected}"id="select"><f:selectItemitemLabel="Selecione..."itemValue="#{null}"/><f:selectItemsvalue="#{paisController.paises}"var="pais"itemLabel="#{pais.name} - #{pais.acronym}"itemValue="#{pais.acronym}"/><p:ajaxevent="change"update="paisOutput"/></p:selectOneMenu><br/><br/><h:outputTextid="paisOutput"value="#{paisController.pais}"/></p:panel></h:form></h:body></html>
Aí pessoal, o fato de não chamar o evento quando seleciono algum país foi resolvido colocando a propriedade immediate=“true” no SelectOneMenu.
Porém ainda não terminei com meu problema… O SelectOneMenu está assim:
O problema agora é que ao selecionar algum país, não está sendo setado para o objeto ‘pais’ do bean. O objeto fica nulo. Enfim, minha próxima tentativa é implementar o Converter como alguns colegas já me sugeriram. Assim que eu tiver um tempinho eu vou tentar implementar e se der certo ou não eu voltarei aqui no tópico. Obrigado a todos desde já.
J
jonas.cant
Pessoal, consegui resolver o problema. Até que enfim!!!
O que eu fiz:
Implementei um converter para a classe Pais. Resultado: não funcionou!
Pesquisei em sites não brasileiros sobre o problema que eu enfrentava, descobri um fórum onde foi postado que na classe da entidade (no meu caso a classe Pais) eu deveria sobrescrever os métodos ‘equals’ e ‘hashCode’. Resultado: agora está funcionando e o ajax está invocando o método a cada troca de país do combobox.
Se alguém que entende do negócio souber me dar uma explicação do porquê ter funcionado, eu fico grato. Muito obrigado a todos que tentaram me ajudar, certamente foi útil e me fez correr atrás de outras soluções.
P.S.: continuo usando o converter, mas acredito que todo problema seria resolvido apenas sobrescrevendo os dois métodos que eu citei.
J
jhoamaral
jonas.cant:
Pessoal, consegui resolver o problema. Até que enfim!!!
O que eu fiz:
Implementei um converter para a classe Pais. Resultado: não funcionou!
Pesquisei em sites não brasileiros sobre o problema que eu enfrentava, descobri um fórum onde foi postado que na classe da entidade (no meu caso a classe Pais) eu deveria sobrescrever os métodos ‘equals’ e ‘hashCode’. Resultado: agora está funcionando e o ajax está invocando o método a cada troca de país do combobox.
Se alguém que entende do negócio souber me dar uma explicação do porquê ter funcionado, eu fico grato. Muito obrigado a todos que tentaram me ajudar, certamente foi útil e me fez correr atrás de outras soluções.
P.S.: continuo usando o converter, mas acredito que todo problema seria resolvido apenas sobrescrevendo os dois métodos que eu citei.
Para o converter funcionar voce precisa do equals e hashCode implementados pois o JSF vai comparar o objeto selecionado com os objetos que estão na lista do OneMenu para saber qual é o correto.
Tudo que vai pra pagina é convertido em String e de alguma forma tem que ser convertido de volta em Objeto para o bean.
J
jonas.cant
Então o problema era a falta do converter e a implementação do método equals e hashCode. Fica aí a solução pra quando outro inexperiente igual a mim tiver este problema.
Muito obrigado pela resposta.