Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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!