Solucionado (ver solução)
Solucionado
(ver solução)
15
respostas

Cadastro com ENUM

Estou com o seguinte problema:

Meu sistema de cadastro de Jogos possui 2 alguns atributos como (id, nome, descrição e plataforma). No caso, meu atributo plataforma e um enum.

Estou com problemas para cadastro um jogo passando um determinado enum.

Classe Jogo:

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column (name = "id_jogo")
    private int id;

    @Column(nullable = false)
    private String nome;

    @Column(nullable = false)
    private String descricao;

    @Enumerated(EnumType.STRING)
    private Plataforma plataforma;

    public Jogo(){}    

    public Jogo(Jogo jogo) {
        this.id = getId();
        this.nome = getNome();
        this.descricao = getDescricao();
        this.plataforma = getPlataforma();
    }

Enum Plataforma:

public enum Plataforma {

    PC("PC"), ONE("ONE"), PS4("PS4");

    private String descricao;    

    private Plataforma(String descricao) {
        this.descricao = descricao;
    }

}

JogoBean:

public class JogoBean implements Serializable{

    private static final long serialVersionUID = 1L;
    private Jogo jogo;
    private JogoDAO jogoDAO;

    public JogoBean(){
        setJogo(new Jogo());
        setJogoDAO(new JogoDAO());
    }

    public String cadastrar() {
        getJogoDAO().cadastrar(getJogo());
        limpaTela();
        return "cadastraJogo.xhtml";
    }

    public void limpaTela(){
        setJogo(null);
    }

    public Plataforma[] getPlataformas(){
        return Plataforma.values();
    }

Estou fazendo o cadastro de Jogo da seguinte forma:

<h:form class="form-label" id="cadastroJogo">

                                    <div class="form-group row">
                                        <label for="thread" class="col-md-12">Nome do Jogo:</label>
                                        <div class="col-md-10">
                                            <h:inputText value="#{jogoMB.jogo.nome}"
                                                class="form-control" id="nomeJogo" />
                                        </div>
                                    </div>            

                                    <div class="form-group row">
                                        <label for="thread" class="col-md-12">Descrição:</label>
                                        <div class="col-md-10">
                                            <h:inputText value="#{jogoMB.jogo.descricao}"
                                                class="form-control" id="descricaoJogo" />
                                        </div>
                                    </div>        

                                    <div class="form-group row">
                                        <label for="thread" class="col-md-12">Plataforma:</label>
                                        <div class="col-md-10">                                
                                                <h:selectOneMenu >
                                                    <f:selectItems value="#{jogoMB.plataformas}" />
                                                </h:selectOneMenu>                    
                                        </div>
                                    </div>    

                                    <div class="text-center">
                                            <h:commandButton action="#{jogoMB.cadastrar()}"
                                                value="Cadastrar"
                                                class="btn btn-primary btn-lg btn-rounded btn-shadow" />
                                        </div>    


                                </h:form>

O cadastro e realizado sem exceção porque o enum não e obrigatorio(por enquanto), porem ao cadastro ele não cadastra o enum.

http://prntscr.com/ch31qk

15 respostas

Faltou você fazer o bind do value do selectOneMenu

Desculpe, não entendi o termo. Pode me mostrar?

Nos seus inputs você usa o atributo value, no selectOneMenu também precisa usar :).

Infelizmente não resolveu, a Plataforma continua vindo como null.

<h:form class="form-label" id="cadastroJogo">

                                    <div class="form-group row">
                                        <label for="thread" class="col-md-12">Nome do Jogo:</label>
                                        <div class="col-md-10">
                                            <h:inputText value="#{jogoMB.jogo.nome}"
                                                class="form-control" id="nomeJogo" />
                                        </div>
                                    </div>            

                                    <div class="form-group row">
                                        <label for="thread" class="col-md-12">Descrição:</label>
                                        <div class="col-md-10">
                                            <h:inputText value="#{jogoMB.jogo.descricao}"
                                                class="form-control" id="descricaoJogo" />
                                        </div>
                                    </div>        

                                    <div class="form-group row">
                                        <label for="thread" class="col-md-12">Plataforma:</label>
                                        <div class="col-md-10">                                
                                                <h:selectOneMenu id="plataformaJogo">
                                                    <f:selectItems value="#{jogoMB.plataformas}" />
                                                </h:selectOneMenu>                    
                                        </div>
                                    </div>    

                                    <div class="text-center">
                                            <h:commandButton action="#{jogoMB.cadastrar()}"
                                                value="Cadastrar"
                                                class="btn btn-primary btn-lg btn-rounded btn-shadow" />
                                        </div>    


                                </h:form>

Acredito que o problema esteja no jogoBean, alguem sabe o que estou esquecendo ?

solução!

O problema continua no mesmo lugar:

<h:selectOneMenu id="plataformaJogo">
    <f:selectItems value="#{jogoMB.plataformas}" />
</h:selectOneMenu>

Deveria ser assim:

<h:selectOneMenu id="plataformaJogo" value="#{jogoMB.plataforma}">
    <f:selectItems value="#{jogoMB.plataformas}" />
</h:selectOneMenu>

Você precisa criar o getter e o setter para a plataforma lá no JogoMB.

O getter e setters para o Plataforma estão na Model de Jogo. Não seria isso o correto?

Pode ser também, depende muito da situação. Na sua pode fazer sentido, aponte para lá então :).

Se eu colocar:

<h:selectOneMenu id="plataformaJogo" value="#{jogoMB.plataforma}">
    <f:selectItems value="#{jogoMB.plataformas}" />
</h:selectOneMenu>

Ao clicar em Cadastrar, nada e feito. O jogo não e cadastrado e não e lançado nenhum erro.

Se eu trocar para:

<h:selectOneMenu id="plataformaJogo">
                                                      <f:selectItems value="#{jogoMB.plataformas}" />
                                                </h:selectOneMenu>

Ele cadastra jogo, mas ainda sem a Plataforma

De uma olhada no meu seguinte método:

public Jogo(){}    

    public Jogo(Jogo jogo) {
        this.id = getId();
        this.nome = getNome();
        this.descricao = getDescricao();
        this.plataforma = getPlataforma();
    }

Esse this.plataforma = getPlataforma(); seria a forma correta?

Essa linha aqui:

<h:selectOneMenu id="plataformaJogo" value="#{jogoMB.plataforma}">

Indica que vc ta passando a plataforma para seu managed bean, mas não parece que vc repassa para o seu model. Desse jeito o valor vai ficar nulo mesmo...

Não parece fazer sentido vc fazer this.plataforma = getPlataforma() de dentro do seu construtor, dado que o objeto sendo criado ainda não tem nenhuma plataforma.

usando "jogoMB.plataforma" ele não encontra.

HTTP Status 500 - /cadastrarJogo.xhtml @72,82 value="#{jogoMB.plataforma}": Property 'plataforma' not found on type br.com.arena.controller.JogoBean

Ele esta exibindo os Enums no formulario, mas ao cadastrar ele não consegue passar o enum selecionado para objeto cadastrado.

Bom, por essa lógica não faz sentido colocar nada no construtor, porque como voce falou o objeto ainda vai ser criado. Mas também existe um construtor vazio.

public Jogo(){}

É pq vc não tem o getter e setter da plataforma no bean. Ou você fazer a ligação direta com seu modelo, algo como "#{joboMB.jogo.plataforma}" ou faz direto com o bean e repassa para o modelo, vc decide.

Eu tenho meu Get e Set de Plataforma na Model de Jogo:

    public Plataforma getPlataforma() {
        return plataforma;
    }

    public void setPlataforma(Plataforma plataforma) {
        this.plataforma = plataforma;
    }

Eu coloquei da seguinte forma:

<h:selectOneMenu id="plataformaJogo" value="jogoMB.jogo.plataformas">
                                                      <f:selectItems value="#{jogoMB.plataformas}" />
                                                </h:selectOneMenu>

Mesmo assim ele não salva a plataforma selecionada no objeto

Você não usou a expression language e colocou plataformas em vez de plataforma.

Alberto, muito obrigado pela sua ajuda!