Problema com Jsf (xhtml acessar Managed Bean)

7 respostas
fer.ferreira6

Galera,

To tendo alguma dificuldade com um projeto.

O xhtml nao acessa o Managed Bean.
É algo simples, mas não acho.

Poderiam dar uma olhada:

xhtml (Parcial):

...

 <h:panelGroup layout="block" id="panelGroup_novaCategoria" styleClass="panelGroup_novaCategoria">
                        <p:commandButton value="Nova Categoria" onclick="dialog_novo.show();" ajax="false" type="button"/>
                    </h:panelGroup>

                    <p:dialog header="Nova Categoria" widgetVar="dialog_novo" resizable="false" width="500" height="100" position="top" closable="true" showEffect="clip" hideEffect="clip" modal="true">  
                        <table>
                            <tr>
                                <td><h:outputLabel value="Nome" id="outputlabel_nome" for="inputText_nome"/></td>
                            </tr>
                            <tr>
                                <td><p:inputText value="#{categoriaMB.categoria.nome}" valueChangeListener="#{categoriaMB.categoria.nome}" id="inputText_nome" size="70"/></td>
                            </tr>
                            <tr>
                                <td><p:commandButton value="Salvar" actionListener="#{categoriaMB.salvar}" ajax="false" styleClass="commandButton_direita" update="dataTableCategoria"/></td>
                            </tr>
                        </table>
                    </p:dialog> 

...

O ManagedBean Completo:

package ManagedBean;

import Dao.CategoriaDao;
import Modelo.Categoria;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;


@ManagedBean(name="categoriaMB")
@RequestScoped
public class CategoriaManagedBean {
    private Categoria categoria;
    private Categoria categoriaSelecionada = new Categoria();
    private CategoriaDao categoriaDao;
    private List<Categoria> listaCategorias = null;
    
    public CategoriaManagedBean(){
        this.categoria = new Categoria();
        this.categoriaDao = new CategoriaDao();
    }
    
    public void salvar(){
        this.categoriaDao.inserir(this.categoria);
        System.out.println("Nome " +this.getCategoria().getNome());
        this.setCategoria(new Categoria());
    }
    
    public void alterar(){
        this.categoriaDao.alterar(this.getCategoria());
    }

    public List<Categoria> getListaCategorias() {
        this.setListaCategorias();
        return listaCategorias;
    }

    public void setListaCategorias() {
        this.listaCategorias = this.categoriaDao.listaTodos();
    }

    public Categoria getCategoria() {
        if(this.categoria == null){
            this.categoria = new Categoria();
        }
        return categoria;
    }

    public void setCategoria(Categoria categoria) {
        this.categoria = categoria;
    }

    public Categoria getCategoriaSelecionada() {
        return categoriaSelecionada;
    }

    public void setCategoriaSelecionada(Categoria categoriaSelecionada) {
        this.categoriaSelecionada = categoriaSelecionada;
    }
}

Esse trecho: <p:inputText value="#{categoriaMB.categoria.nome}" valueChangeListener="#{categoriaMB.categoria.nome}" id=“inputText_nome” size=“70”/> nao acessa o MB

7 Respostas

J

Não está funcionando pelo fato que o valueChangeListener precisa de um método que responde a uma assinatura definida. No caso seu atributo nome da classe Categoria é o valor e acredito que não tenha um método public void nome(ValueChangeEvent e){ ...} na sua classe Categoria.
Estude como funciona o valueChangeListener e o que ele precisa para funcionar.

Hebert_Coelho

Vc sabe para que server isso? valueChangeListener="#{categoriaMB.categoria.nome}"

Retire e tente novamente.

fer.ferreira6

Ese valueChangeListener era um teste.
Já retirei ele.

O problema é que o setNome do modelo Categoria é chamado duas vezes pelo ManagedBean CategoriaManagedBean

J

Qual o erro então?
Se o método está sendo chamado, o managed bean está sendo acessado.

fer.ferreira6

To quase achando o erro.

O setNome é chamado duas vezes.

Provavelmente é o dialog.

J

Estude o ciclo de vida e as fases de uma aplicação jsf. Verá que está correto esse método ser chamado 2 vezes.

fer.ferreira6

Cara, não tá correto.

No meu projeto, o método setNome é chamado duas vezes, dessa forma, um valor válido é substituído por um valor nulo.
Já achei onde está o erro, só preciso corrigir.

Tenho um DataTable e dois dialogs, ambos do primefaces.

Quando deixo 01 dialog e a datatable funciona perfeitamente.
Quando deixo 02 dialog e a datatable, ocorre o erro.

Já fiz alguns projetos usando o primefaces 2, e esse é o primeiro usando o primefaces 3, achei que o erro estava nele.

Obrigado pela ajuda, assim que arrumar, se for algo importante, posto aqui.

Feliz natal também =D

Criado 24 de dezembro de 2011
Ultima resposta 24 de dez. de 2011
Respostas 7
Participantes 3