[Resolvido]Acessar uma propriedade de um Objeto - SelectOneMenu

25 respostas
L

Olá,

estou com um probleminha aqui com minha página em JSF2 + Facelet.

Tenho uma selectOneMenu para exibir os Estados.

Criei uma Bean que contém a lista destes estados. O Estado é uma classe que contem as propriedades nome e sigla.

Preciso acessar somente a sigla do objeto estado que está na lista. Estou tentando o seguinte e está dando erro esquisito de NumberFormatException:

<h:selectOneMenu  value="#{ufBean.estados.sigla}" >
                            <f:selectItems value="#{ufBean.estados.nome}" />
                        </h:selectOneMenu>

Alguem pode me ajudar?

25 Respostas

L

Editado.

Pensei que tinha resolvido, mas nao resolveu.

Flavio_machine

Cara coloca o código do managed

savioalberto

E ai Lucas.

<h:selectOneMenu id="uf" value="#{ufBean.estado}">
  <f:selectItem itemValue="" itemLabel=""/> // Para o primeiro item da lista ficar em branco.
  <f:selectItems value="#{ufBean.estados}" var="u" itemValue="#{u}" itemLabel="#{u.nome}"/>
</h:selectOneMenu>

// #{ufBean.estado} -> Objeto estado em seu Bean que recebera o estado que você escolher.
// #{ufBean.estados} -> A lista de estados.
// var="u" itemValue="#{u}" itemLabel="#{u.sigla}" -> Cria uma variável que terá o estado. O valor que será passado (No caso, uma instância de estado). Oque irá aparecer no label (No caso a sua sigla).

Flws.

L

Flávio, muito obrigado pela atenção, mas utilizei o código do savioalberto e deu certo.

Valeu pessoal!

Flavio_machine

Ok força e avante

L

Aproveitando o embalo.

E para eu fazer uma injeção de dependência com estes Objetos que estão na Lista?

Voces sabem? Estaou tentando assim:

@ManagedProperty(value="#{ufBean.estados}")

Mas isto retorna a lista inteira. E preciso somente de um objeto que está nesta Lista e que foi selecionada no selectOneMenu.

Desde já agradeço!

Flavio_machine
<managed-bean>

<managed-bean-name>config</managed-bean-name>

<managed-bean-class>br.com.totalsat.jsf.conf.Conf</managed-bean-class>

<managed-bean-scope>session</managed-bean-scope>

</managed-bean>
<managed-bean>

<managed-bean-name>controllerPosicoes</managed-bean-name>

<managed-bean-class>br.com.totalsat.jsf.controller.ControllerPosicoes</managed-bean-class>

<managed-bean-scope>session</managed-bean-scope>

<property-name>conf</property-name>

<value>#{config}</value>

</managed-property>

</managed-bean>

Fiz sem o spring acho que ficou da legal

savioalberto

Lucas, se você fez do geito que expliquei:

<h:selectOneMenu id="uf" value="#{ufBean.estado}">  
  <f:selectItem itemValue="" itemLabel=""/> // Para o primeiro item da lista ficar em branco.  
  <f:selectItems value="#{ufBean.estados}" var="u" itemValue="#{u}" itemLabel="#{u.nome}"/>  
</h:selectOneMenu>

… então no seu Bean tem um objeto estado do tipo Estado… esse objeto que vai receber o estado que você esclheu… então … você tem que injetar ele … e não um elemento da lita.

Quaquer coisa, posta ai seu UfBean.

Flws.

L

[email removido:
]Lucas, se você fez do geito que expliquei:

<h:selectOneMenu id="uf" value="#{ufBean.estado}">  
  <f:selectItem itemValue="" itemLabel=""/> // Para o primeiro item da lista ficar em branco.  
  <f:selectItems value="#{ufBean.estados}" var="u" itemValue="#{u}" itemLabel="#{u.nome}"/>  
</h:selectOneMenu>

… então no seu Bean tem um objeto estado do tipo Estado… esse objeto que vai receber o estado que você esclheu… então … você tem que injetar ele … e não um elemento da lita.

Quaquer coisa, posta ai seu UfBean.

Flws.

Oi Savio,

Fiz exatamente o mesmo do seu. No entanto, quando tento:

@ManagedProperty(value="#{u}")
    private Estado estado;

que no caso seria o Estado selecionado, ele dá erro de nullpointer. Acho que é por casuo do escopo ne?

Flavio_machine

Como funciona esse mandaged property com annotation Savio ?

savioalberto

Tente assim

@ManagedProperty(value="#{ufBean.estado}")

L

É do JSF 2. Faz-se a DI sem configuração de XML config-face. Ele injeto o objeto:

@ManagedProperty(value="#{u}")
    private Estado estado;

Que no caso seria o Objeto Estado da página. Mas estou recebendo um NullPointer.

L

[email removido:
]Tente assim

@ManagedProperty(value="#{ufBean.estado}")

Então amigo, eu tentei, so que dessa forma ele retorna a Lista inteira. É a mesma lista que popula o selectOneMenu. Será que tem como pegar o Objeto dessa Lista? Seria o Objeto selecionado na select…

Muito obrigado pela força!

Flavio_machine

Legal gostei desse esquema

savioalberto

Lucas.
Posta seu ufBean ai .
Porque o certo é…

@ManagedProperty(value="#{ufBean.estados}") Retornar a lista
e
@ManagedProperty(value="#{ufBean.estado}") Retornar o objeto

L
[email removido:
]Lucas. Posta seu ufBean ai . Porque o certo é...

@ManagedProperty(value="#{ufBean.estados}") Retornar a lista
e
@ManagedProperty(value="#{ufBean.estado}") Retornar o objeto

A UfBean
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ManagedBean;
import essencial.Estado;
import java.util.List;
import java.util.ArrayList;

@ManagedBean(name = "ufBean")
@RequestScoped

public class UfBean {

    private List<Estado> estados;
    private Estado estado;

    public UfBean(){

        estados = new ArrayList<Estado>();
        
         //Método para popular a Lista com os Objetos Estado.

         //Instancia um Estado

    }

    public List getEstados() {
        return estados;
    }

    public void setEstados(List<Estado> estados) {
        this.estados = estados;
    }


    public Estado getEstado() {
        return estado;
    }

    public void setEstado(Estado estado) {
        this.estado = estado;
    }

    




}

e a CidadeBean que recebe a injeção:

@ManagedBean(name = "cidadeBean")
@RequestScoped
public class CidadeBean {

    @ManagedProperty(value="#{ufBean.estado}")
    private Estado estado;
    
    private List<Cidade> listaCidade;

    public CidadeBean(){

       //Método para iniciar

    }

    public void atualizaLista(AjaxBehaviorEvent e){

        //Método para atualizar a Lista conforme a UF selecionada
           
    }

    public Estado getEstado() {
        return estado;
    }

    public void setEstado(Estado estado) {
        this.estado = estado;
    }

    public List<Cidade> getListaCidade() {
        return listaCidade;
    }

    public void setListaCidade(List<Cidade> listaCidade) {
        this.listaCidade = listaCidade;
    }

    

    

}
Flavio_machine

Atui vc tem que colocar a variável da classe estado que vc quer setar

<h:selectOneMenu id=“uf” value="#{ufBean.estado.NOMEDAVARIAVEL}">

L

Agora deu certo…
Parou de dar NullPointer, está pegando o Estado.

Mas, do nada, parou de funcionar o Ajax que alimentava a Select da Cidade, agora :lol:

L

Colegas,

Ainda não consegui…ManagedProperty está retornando null ainda…

o trecho:

<h:selectOneMenu id="cbUf" value="#{ufBean.estado}"   immediate="true"  >

Parece que nao está “setando” uma instancia de Bean.

Por gentileza, alguem pode me ajudar?

Flavio_machine

Cara será que vc não ta usando ele sem setar antes, quando vc carrega uma tela que usa a propriedade e ela ta nula.
Você já debugou ?

L

Flavio machine:
Cara será que vc não ta usando ele sem setar antes, quando vc carrega uma tela que usa a propriedade e ela ta nula.
Você já debugou ?

Oi Falvio, tudo bem?

Então, eu não estou setando ele antes. Ms quando eu seto ele antes na Managed Bean, acontece a injeção desta instância, independente do valor que eu selecionar na selectOneMenu.

É como se a selectOneMenu não configurasse os valores.

Engraçado é que quando faça com Strings, ele funciona.

Vou continuar tentando aqui.

Quaquer ajuda é bem vinda,

Muito obrigado

ps.

Só para ver se ajuda melhor…Ele dá esse erro :

Conversion Error setting value ‘Estado@399197b’ for ‘null Converter’.

Flavio_machine

Cara eu faço isso com o xml nao tinha feito com anotation mas tem que funcionar das duas formas né, mas quando deu faço eu injeto a classe inteira e dou um get. Você esquece de falar se debugou ?

L

Flavio machine:

Cara eu faço isso com o xml nao tinha feito com anotation mas tem que funcionar das duas formas né, mas quando deu faço eu injeto a classe inteira e dou um get. Você esquece de falar se debugou ?

Debugei.

Acusou erro de NullPointerException bem na hora que eu chamo a instancia de estado que era pra ter recebido a injeção. Ou seja, a injeção está retornando nulo. Não pórque a Injeção está errada, mas porque o componente selectOneMenu não está “setando” a instância do Estado.

Muito obrigado pela atenção.

L

Lucas Emanuel:
Flavio machine:

Cara eu faço isso com o xml nao tinha feito com anotation mas tem que funcionar das duas formas né, mas quando deu faço eu injeto a classe inteira e dou um get. Você esquece de falar se debugou ?


Debugei.

Acusou erro de NullPointerException bem na hora que eu chamo a instancia de estado que era pra ter recebido a injeção. Ou seja, a injeção está retornando nulo. Não pórque a Injeção está errada, mas porque o componente selectOneMenu não está “setando” a instância do Estado.

Voce usa Converter?

Muito obrigado pela atenção.

L

Olá Colegas,

Resolvi o meu problema criando um Converter.

Obrigado a todos que me ajudaram.

Criado 29 de setembro de 2010
Ultima resposta 6 de out. de 2010
Respostas 25
Participantes 3