Problemas com selectOneMenu

14 respostas
G

Galera, desculpem criar mais um tópico sobre isso, mas já pesquisei em tudo quanto é canto e li de tudo, não consigo entender, vejam só:

<h:selectOneMenu id="desc" value="#{clienteBean.categoria.nome}" title="Selecione"> <f:selectItems value="#{categoriaClienteBean.itensCategoria}"/> </h:selectOneMenu> <rich:spacer width="2" /> <a4j:commandLink action="#{clienteBean.adicionaCategoriaNoCliente}" ajaxSingle="false" reRender="categoriaOutputPanel, formTabelaCategoria, tableCategoriaCliente" immediate="true"> <h:graphicImage value="/images/ok3.png" title="Adicionar categoria selecionada ao cliente"/> </a4j:commandLink>

o selectOneMenu carrega tudo direitinho, mas quando eu clico no botão de adicionar ele me manda um NullPointer na cara, logo, aquele atributo está nulo (ele é testado no método do backing bean usando um .trim(""), mas porque está vazio se eu tenho valores apontando pra ele?

Comecei a desenvolver para web agora e ainda estou um pouco enrolado com esses problemas.
Obrigado!

14 Respostas

thiagocg

Posta o erro q fica mais fácil, mas da uma olhada se a sua entidade categoria não esta nula, uma outra coisa o q é carregado nessa sua lista de selectItems?

[]'s

G

Já testei, vê só:

public String adicionaCategoriaNoCliente() { System.out.println("executando adicionaCategoriaNoCliente: " + categoria.getNome()); try { if (!categoria.getNome().trim().equals("")) { (...) } } catch (Exception e) { System.out.println("ERRO CAPTURADO"); } return null; }

Dai obtenho:

INFO: executando adicionaCategoriaNoCliente: null INFO: ERRO CAPTURADO

thiagocg

Testa se a categoria não esta nula, pois se vc fizer um categoria.getNome() por o getNome ser uma metodo de instancia, ele irá gerar um nullPointer…

G

Pior que eu já testei, ela não está nula.

Apenas o dela nome está, como se o valor não estivesse indo parar lá.

G

Acabei de fazer um teste onde eu seto um nome de uma categoria existente no BD no nome do objeto categoria que é usado no método de adicionarCategoriaNoCliente e funcionou direitinho, isso prova que é apenas o valor do selectOneMenu que não está indo parar no nome da categoria, alguém consegue ver o porque?

Segue o código que funcionou:

public String adicionaCategoriaNoCliente() { categoria.setNome("OUTRO"); if (!categoria.getNome().trim().equals("")) { (...) return null; }

R

Mostra como vc tá populando ‘itensCategoria’

G

Segue:

public List<SelectItem> getItensCategoria() { LinkedList<SelectItem> itens = new LinkedList<SelectItem>(); itens.add(new SelectItem("Todos")); for (Categoria catItem : getCategorias()) { itens.add(new SelectItem(catItem.getNome())); } return itens; }

G

Segue um trechinho do erro:

AVISO: #{clienteBean.adicionaCategoriaNoCliente}: java.lang.NullPointerException javax.faces.FacesException: #{clienteBean.adicionaCategoriaNoCliente}: java.lang.NullPointerException at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) at javax.faces.component.UICommand.broadcast(UICommand.java:315) at org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent.java:55) at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:329) at org.ajax4jsf.component.AjaxViewRoot.broadcastEventsForPhase(AjaxViewRoot.java:304) at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:261)

G

Help?

R

Tá faltando vc identificar o valor que vai ser atribuido a propriedade:

Poderia ser algo como:

public List&lt;SelectItem&gt; getItensCategoria() {  
         LinkedList&lt;SelectItem&gt; itens = new LinkedList&lt;SelectItem&gt;();  
         itens.add(new SelectItem("Todos"));  
         for (Categoria catItem : getCategorias()) {  
              itens.add(new SelectItem(catItem.getNome(),catItem.getNome()));  
         }  
         return itens;  
    }

O primeiro argumento é o valor a ser setado,e o segundo argumento é o label do combo.

G

Na verdade eu testei isso logo após a hora que você pediu que eu mostrasse esse método, continuou com o mesmo problema, fiz exatamente a mesma modificação que você.

Acontece que quando tem apenas o atributo do value, o value e o label ficam iguais, dai dá no mesmo (pelo que entendi)

R

Debuga esse metodo adicionaCategoriaNoCliente pra ver o q está dando null.

G

Vou debugar

G

É o nome da categoria que está null mesmo, quando tenta dá o .trim nele, lança a exceção.

Criado 14 de setembro de 2011
Ultima resposta 14 de set. de 2011
Respostas 14
Participantes 3