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

Dados do formulário chegam como NULL após o submit

Senhores, estou utilizando CDI 1.2 em conjunto com JSF 2.2 (Primefaces) e embora eu tenha tentado utilizar o BootsFaces eu o abandonei em razão de uma falha que eu atribuía a utilização da biblioteca do Bootsfaces.

Quando meus inputs estavam contidos dentro de um panel do bootsfaces então a informação preenchida nos inputs não chegava ao ManagedBean, descoberto isto removi a LIB e passei a trabalhar apenas com primefaces, porém... infelizmente o erro ainda persiste e as informações sempre chegam nulas ao bean.

ProjetoBean.java

import java.io.Serializable;
import java.util.List;

import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import com.projeto.timesheet.dao.ProjetoDAO;
import com.projeto.timesheet.entity.Projeto;

@Named
@SessionScoped
public class ProjetoBean implements Serializable {

    private static final long serialVersionUID = 1L;

    public ProjetoBean(){
        clean();
    }

    @Inject
    private ProjetoDAO dao;    

    private Projeto projeto;

    private List<Projeto> projetos;

    public Projeto getProjeto() {
        return projeto;
    }

    public void setProjeto(Projeto projeto) {
        this.projeto = projeto;
    }

    public void salvar(){        
        try{
            dao.salvar(projeto);
            clean();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"SUCESSO!","O PROJETO FOI SALVO!");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch(Exception e){
            e.printStackTrace();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"ERRO AO SALVAR PROJETO","COMUNIQUE A ÁREA TÉCNICA!");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void pesquisar(){
        try{
            this.projetos = dao.pesquisar(projeto);
        }catch(Exception e){
            e.printStackTrace();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"ERRO AO PESQUISAR PROJETO","COMUNIQUE A ÁREA TÉCNICA!");
            FacesContext.getCurrentInstance().addMessage(null, msg);    
        }
    }

    public List<Projeto> getProjetos() {
        return projetos;
    }

    public void setProjetos(List<Projeto> projetos) {
        this.projetos = projetos;
    }    

    private void clean(){
        this.projeto = new Projeto();
    }    
}

Minha estrutura de páginas se encontra da seguinte forma: webapp --> management --> projeto -> gerenciamento-de-projetos.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">

<ui:composition template="/resources/template/template.xhtml">
    <ui:define name="corpoDaPagina">
        <h:form prependId="false">
            <p:messages autoUpdate="true" showDetail="true" />
            <p:tabView activeIndex="0">
                <p:tab title="Cadastro de Projeto" icon="fa fa-database fa-fw">
                    <ui:include src="/management/projeto/tab-cadastro-projetos.xhtml" />
                </p:tab>
                <p:tab title="Pesquisa de Projetos" icon="fa fa-search fa-fw">
                    <ui:include src="/management/projeto/tab-cadastro-consulta.xhtml" />
                </p:tab>
            </p:tabView>
        </h:form>
    </ui:define>
</ui:composition>
</html>

webapp --> management --> projeto -> tab-cadastro-projetos.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui" xmlns:b="http://bootsfaces.net/ui">

    <div class="ui-fluid">
        <p:panelGrid layout="grid" columns="1"
            columnClasses="ui-grid-col-12,ui-grid-col-2"
            styleClass="ui-panelgrid-blank">
            <p:outputLabel value="Nome do Projeto" for="txtNomeProjeto" />
            <p:inputText value="#{projetoBean.projeto.nomeProjeto}"
                id="txtNomeProjeto" name="txtNomeProjeto" />
        </p:panelGrid>
        <p:panelGrid layout="grid" columns="1"
            columnClasses="ui-grid-col-2,ui-grid-col-12"
            styleClass="ui-panelgrid-blank">
            <p:commandButton value="Salvar" action="#{projetoBean.salvar()}"
                process="@form"/>
        </p:panelGrid>
    </div>
</ui:composition>

E agora?

3 respostas

Percebi algo interessante...

A classe projeto é gerenciada pelo JPA e possúi a annotation @Entity

Ela é instanciada direto no ManagedBean e a atribuição ao valor dela é feita direto da página.

{ProjetoBean.projeto.nomeProjeto}

Tentei criar uma classe qualquer sem a anotação @Entity, ao invés dela utilizei a anotação @Named do CDI e a atribuição de valor através do formulário funcionou com essa classe:

import javax.inject.Named;

@Named
public class OutraEntidade {

    private String nome;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }    
}

Com base nessa experiencia, tentei adicionar a anotação @Named na minha entidade Projeto, porém, não surtiu efeito.

E agora?

fala Cleiton, tudo bem? A anotação Entity serve para orientar a JPA, o CDI já tem acesso a essa classe mesmo sem a anotação @Named.

O que me causou estranhesa foi esse código:

public ProjetoBean(){
        clean();
    }

tente tirar esse construtor e veja se funciona. Durante o processo do ciclo de vida do JSF ele vai acabar chamando esse construtor diversas vezes. Como a responsabilidade de instanciar a classe deve ser do CDI e não nossa, não é aconselhável usar construtor.

solução!

Samir, obrigado pela sugestão mas o erro acontecia em funcao de dois includes no mesmo formulário e entao o campo submetido era enviado uma vez preenchido e a outra vez era enviado vazio... em funcao dos dois includes.