JSF como pegar codigo de um item no selectOneMenu

Pessoal,
Por favor me ajudem. sou iniciante
estou com um problema:
tenho um TemaBean onde faço o crud do tema
tbm tenho ComentarioBean onde quero fazer o crud co comentario.
só que quando vou cadastrar comentário preciso selecionar um tema.
olha a tela:
<h:form>
<h:panelGrid columns=“2”>
<h:outputText value=“Tema:”/>
<h:selectOneMenu value="#{TemaBean.id}">
<f:selectItems value="#{TemaBean.selectTema}" var=“tema” itemValue="#{TemaBean.id}" itemLabel="#{TemaBean.descricao}"/>
</h:selectOneMenu>
<h:outputText value=“Comentário:”/>
<h:inputTextarea value="#{ComentarioBean.nome}" required=“true” requiredMessage=“Campo Obrigatório”/>
<h:commandButton value=“Salvar” action="#{ComentarioBean.CadastrarComentario}" type=“submit”/>
</h:panelGrid>
</h:form>
só que quando mandar Salvar tema sempre vai null.
não estou sabendo resolver isso.
Ajuda galera!
ta aqui o meu comentarioBean
@ManagedBean(name = “ComentarioBean”)
@RequestScoped
public class ComentarioBean {

private int cod;
private String nome;
private TemaBean tema;
/**
 * @return the cod
 */
public int getCod() {
    return cod;
}

/**
 * @param cod the cod to set
 */
public void setCod(int cod) {
    this.cod = cod;
}

/**
 * @return the nome
 */
public String getNome() {
    return nome;
}

/**
 * @param nome the nome to set
 */
public void setNome(String nome) {
    this.nome = nome;
}

public ComentarioBean() {
}

public ComentarioBean(int codComentario, String nomeComentario, TemaBean tema) {
    this.cod = codComentario;
    this.nome = nomeComentario;
    this.tema = tema;
}

/**
 * @return the tema
 */
public TemaBean getTema() {
    return tema;
}

/**
 * @param tema the tema to set
 */
public void setTema(TemaBean tema) {
    this.tema = tema;
}

public void CadastrarComentario() throws IOException {
    try {
        ComentarioDAO comentariodao = new ComentarioDAO();
        comentariodao.Cadastrar(this.nome);
        int c = comentariodao.pegarCod(this.nome);
        
        comentariodao.CadastrarTemaComentario(cod, c);
        FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarSucesso.xhtml");
    } catch (Exception e) {
        FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarErro.xhtml");
    }

}

}

Coloca o seu código entre as tags [ code ] e [ /code ] (sem os espaços) para que a gente consiga analizar melhor, desta forma fica horrível de se ler.
Posta também seu TemaBean

Primeiro, os nomes dos MB devem ser com a primeira letra em minúsculo, pois são objetos. Com relação ao problema, deve estar acontecendo algum erro na fase de validação. Coloca um <h:messages/> para ver se algum erro é exibido.

TemaBean

@ManagedBean(name = "TemaBean")
@SessionScoped
public class TemaBean {

    /**
     * Creates a new instance of TemaBean
     */
    public TemaBean() {
    }
    private int id;
    private String descricao;
    private List<SelectItem> selectTema;

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the descricao
     */
    public String getDescricao() {
        return descricao;
    }

    /**
     * @param descricao the descricao to set
     */
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public TemaBean(int id, String descricao) {
        this.id = id;
        this.descricao = descricao;
    }

    public void Cadastrar() throws IOException {
        try {
            TemaDAO dao = new TemaDAO();
            dao.Cadastrar(this.descricao);
            FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarSucesso.xhtml");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarErro.xhtml");
        }

    }

    /**
     * @return the selectTema
     */
    public List<SelectItem> getSelectTema() {
        selectTema = new ArrayList<SelectItem>();
        TemaDAO dao = new TemaDAO();
        List<TemaBean> listaTema = dao.listar();
        for (TemaBean temaBean : listaTema) {
            selectTema.add( new SelectItem(temaBean.id, temaBean.descricao));
        }
        return selectTema;
    }

    /**
     * @param selectTema the selectTema to set
     */
    public void setSelectTema(List<SelectItem> selectTema) {
        this.selectTema = selectTema;
    }
    
    
}

ComentarioBean

@ManagedBean(name = "ComentarioBean")
@RequestScoped
public class ComentarioBean {

    private int cod;
    private String nome;
    private TemaBean tema;
    /**
     * @return the cod
     */
    public int getCod() {
        return cod;
    }

    /**
     * @param cod the cod to set
     */
    public void setCod(int cod) {
        this.cod = cod;
    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    public ComentarioBean() {
    }

    public ComentarioBean(int codComentario, String nomeComentario, TemaBean tema) {
        this.cod = codComentario;
        this.nome = nomeComentario;
        this.tema = tema;
    }

    /**
     * @return the tema
     */
    public TemaBean getTema() {
        return tema;
    }

    /**
     * @param tema the tema to set
     */
    public void setTema(TemaBean tema) {
        this.tema = tema;
    }

    public void CadastrarComentario() throws IOException {
        try {
            ComentarioDAO comentariodao = new ComentarioDAO();
          //  comentariodao.Cadastrar(this.nome);
            int c = comentariodao.pegarCod(this.nome);
            
            comentariodao.CadastrarTemaComentario(cod, c);
            FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarSucesso.xhtml");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarErro.xhtml");
        }

    }

    public List<ComentarioBean> listarTemaComentario() {
        List<ComentarioBean> temaComentario = new ArrayList<ComentarioBean>();
        ComentarioDAO comentariodao = new ComentarioDAO();
        temaComentario = comentariodao.listarTemaComentario();
        return temaComentario;
    }
    

}

CadastrarComentario.xhtml

<h:form>
                    <h:panelGrid columns="2">
                        <h:outputText value="Tema:"/>
                        <h:selectOneMenu value="#{TemaBean.id}">
                            <f:selectItems value="#{TemaBean.selectTema}" var="tema" itemValue="#{TemaBean.id}" itemLabel="#{TemaBean.descricao}"/>
                        </h:selectOneMenu>
                        <h:outputText value="Comentário:"/>
                        <h:inputTextarea value="#{ComentarioBean.nome}" required="true" requiredMessage="Campo Obrigatório"/>
                        <h:commandButton value="Salvar" action="#{ComentarioBean.CadastrarComentario}" type="submit"/>
                    </h:panelGrid>
                </h:form>

Cumpade, você leu minha resposta acima?

sim benignoms,
antes de tudo obrigado pela ajuda.
eu tentei colocar o messages mas não mostrou nenhuma mensagem, pode me indicar onde posso colocar?
e sobre os métodos, eu coloquei os nomes dos metodos em maiúsculo, e chamar com minusculo da um erro dizendo que não encontrou.
será que é isso?

Veja bem:

Método é uma coisa objeto é outra. Mas eu vi que você nomeia os objetos com letra maiúscula(@ManagedBean(name = “TemaBean”)). No console do Glassfish/Tomcat não aparece nenhum erro?

[quote=midanaf]sim benignoms,
antes de tudo obrigado pela ajuda.
eu tentei colocar o messages mas não mostrou nenhuma mensagem, pode me indicar onde posso colocar?
e sobre os métodos, eu coloquei os nomes dos metodos em maiúsculo, e chamar com minusculo da um erro dizendo que não encontrou.
será que é isso?[/quote]

pois é, como falei sou novo e eu sabia que objeto começa com minusculo, mas pra te dizer a verdade eu não sabia que este @managedBean(name) era criando objeto. obrigado pela informação.

olha no glash fish da um Advertência.

Advertência: JSF1063: AVISO! Definindo valor de atributo não serializável em HttpSession (chave: TemaBean, classe do valor: jv.TemaBean).

só que como estou chamando uma tela de erro, no meu browse, vai pra tela de erro.
quando vou debugando, vejo que o tema.id é null

fiz uma alteração no metodo cadastrar no comentárioBean

public void CadastrarComentario() throws IOException {
        try {
            ComentarioDAO comentariodao = new ComentarioDAO();
            comentariodao.Cadastrar(this.nome);
            int c = comentariodao.pegarCod(this.nome);
            
            comentariodao.CadastrarTemaComentario(tema.getId(), c);
            FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarSucesso.xhtml");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarErro.xhtml");
        }

coloquei tema.getId() no luggar de cod, pois cod era o codigo de comentário. mas mesmo assim o tema vem null. é como se ele não seleciona o tema. será é algum problema com selectedItem?

Se vc estiver utilizando o netbeans, marque a variável que vc quer ver o valor como “novo observador”, indique um ponto de interrupção na linha que vc quer interromper a execução, depois execute no modo depurador. Daí fica clicando no ícone “Passar por dentro (F7)”…vc conseguirá ver passo a passo e execução do seu código.

bobfroes,

não sei marcar varia=ável como novo observador. favor pode me dizer como fazer?
mas também já debuguei, só que o objeto tema ja vem null. não estou sabendo pegar dado do tema.
que estou listando no combobox

E aeh presença,

     É só selecionar com o botão direito do mouse e escolher "novo observador" no objeto que vc quer ver os valores.  Daí vc poderá visualizar as variáveis no console de saída.  :)

Tenta utilizar a classe Converter (tem muitos exemplos por aí), isso pq sua lista é do tipo SelectItem . Um item de sua lista será convertido para um objeto da sua classe.


public List&lt;SelectItem&gt; getObjetos() {
        if (objetoItens == null) {
            objetoItens = new ArrayList&lt;SelectItem&gt;();

            for (Objeto obj : seuDao.pegaTodos()) {
                SelectItem item = new SelectItem(obj.getCodigo(), obj.getDescricao());
                objetoItens.add(item);
            }
        }
        return objetoItens;
}

Se joga aí…

amigo BOB estou fazendo isso mesmo

public List<SelectItem> getSelectTema() {
        selectTema = new ArrayList<SelectItem>();
        TemaDAO dao = new TemaDAO();
        List<TemaBean> listaTema = dao.listar();
        for (TemaBean temaBean : listaTema) {
            selectTema.add( new SelectItem(temaBean.id, temaBean.descricao));
        }
        return selectTema;
    }

veleu aí pela dica de observação da variavel.
só que infelismente está vindo null

Amigo Midana, primeiro altere:

Isto:
<h:selectOneMenu value="#{TemaBean.id}">
<f:selectItems value="#{TemaBean.selectTema}" var=“tema” itemValue="#{TemaBean.id}" itemLabel="#{TemaBean.descricao}"/>
</h:selectOneMenu>

Para isso:
<h:selectOneMenu value="#{TemaBean.id}">
<f:selectItems value="#{TemaBean.selectTema}" var=“tema” itemValue="#{tema.id}" itemLabel="#{tema.descricao}"/>
</h:selectOneMenu>

Outra coisa, vendo o selectTema tu tá usando o teu Managed Bean dentro de um list para popular a combo e isso é uma coisa horrivel. Tu tem q criar uma classe com id e descricao, chama ela de Tema, ela pode até ser uma entidade. Feito isso vc popula a List com Tema e não com TemaBean. Mas até ser que funcione, só que isso é feio.

O que tá acontecendo é o seguinte, tu tem uma combo preenchida com valores do getSelectTema, eles aparecem? Ai quando tu seleciona ele pega a propriedade itemValue, que eh ="#{TemaBean.id}" e tenta setar no value do combo que tb eh ="#{TemaBean.id}". Ou seja ambos são nulo. O q tu quer setar la é ="#{tema.id}" que ta na combo. Acredito que com isso ja funciona. Mas q tem codigo tá feio tá. :slight_smile:

valeu raphael…

Pessoal muito obrigado,
na verdade de forma que estava a estrutura do meu trabalho ficaria dificil resolver. então com ajuda do Raphael, tirei os atributos do tema e coloquei numa classe (model). depois ficou mais fácil listar e pegar o codigo.
segue o ComentarioBean depois das mudanças

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controler;

import dao.ComentarioDAO;
import dao.TemaDAO;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import model.Comentario;
import model.Tema;

/**
 *
 * @author Midana
 */
@ManagedBean(name = "comentarioBean")
@RequestScoped
public class ComentarioBean implements Serializable {

    private Comentario comentario;
    private List<SelectItem> selectTema;
    private List<SelectItem> selectComentario;
    

    public ComentarioBean() {
        comentario = new Comentario();
    }

    public void CadastrarComentario() throws IOException {
        try {
            ComentarioDAO comentariodao = new ComentarioDAO();
            comentariodao.Cadastrar(getComentario().getNome());
            int c = comentariodao.pegarCod(getComentario().getNome());

            comentariodao.CadastrarTemaComentario(Integer.parseInt(getComentario().getTema()), c);
            FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarSucesso.xhtml");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarErro.xhtml");
        }

    }

    public List<Comentario> listarTemaComentario() {
        List<Comentario> temaComentario = new ArrayList<Comentario>();
        ComentarioDAO comentariodao = new ComentarioDAO();
        temaComentario = comentariodao.listarTemaComentario();
        return temaComentario;
    }

    /**
     * @return the selectTema
     */
    public List<SelectItem> getSelectTema() {
        selectTema = new ArrayList<SelectItem>();
        TemaDAO dao = new TemaDAO();
        List<Tema> listaTema = dao.listar();
        for (Tema tema : listaTema) {
            selectTema.add(new SelectItem(tema.getId(), tema.getDescricao()));
        }
        return selectTema;
    }

    /**
     * @return the comentario
     */
    public Comentario getComentario() {
        return comentario;
    }

    /**
     * @param comentario the comentario to set
     */
    public void setComentario(Comentario comentario) {
        this.comentario = comentario;
    }
    public List<SelectItem> getSelectComentario() {
        selectComentario = new ArrayList<SelectItem>();
        ComentarioDAO dao = new ComentarioDAO();
        List<Comentario> listaComenatario = dao.listarTemaComentario();
        for (Comentario comentarios : listaComenatario) {
            selectComentario.add(new SelectItem(comentarios.getNome(), comentarios.getTema()));
        }
        return selectComentario;
    }
}