Página jsf não chama método no bean

Pessoal estou com um problema pois minha página jsf não chama meu método na minha classe bean, abaixo segue minha página:


<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <link rel="stylesheet" type="text/css" href="#{facesContext.externalContext.request.contextPath}/resources/css/botoes.css"/>
        <title>SCER - Cadastro de fabricantes</title>
    </h:head>
    <h:body>
        <ui:composition template="/WEB-INF/template.xhtml">
            <ui:define name="conteudoPrincipal">
                <p:panel header="Cadastro de fabricante">
                    <h:form id="form">
                        <p:growl id="growl" showDetail="true"/>

                        <p:dataTable id="dataTableCadFrabricantes" var="fabricante" value="#{fabricanteMB.fabricanteDataModel}" paginator="true" rows="10"
                                     paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                                     rowsPerPageTemplate="5,10,15"
                                     paginatorPosition="bottom"
                                     selection="#{fabricanteMB.fabricante}" selectionMode="single">

                            <f:facet name="header">
                                Fabricantes
                            </f:facet>

                            <p:column headerText="Nome">
                                #{fabricante.nome}
                            </p:column>

                            <p:column headerText="Telefone">
                                #{fabricante.telefone}
                            </p:column>

                            <p:column headerText="Email" >
                                #{fabricante.email}
                            </p:column>

                        </p:dataTable>
                        <p:separator/>
                        <fieldset id="barraBotoesTelaGerenciamento">
                            <p:commandButton value="Cadastrar" disabled="false" actionListener="#{fabricanteMB.salvar()}" oncomplete="cadFabricante.show();"/>
                            <p:commandButton value="Editar" disabled="false"/>
                            <p:commandButton value="Excluir" disabled="false"/>
                            <p:commandButton value="Visualizar" disabled="false"/>
                        </fieldset>

                        <p:dialog id="dlgCadastrarFab" header="Cadastrar Fabricante" widgetVar="cadFabricante" resizable="false" modal="true" minHeight="400" width="400">  

                            <h:panelGrid id="pngCadastrar" columns="2" cellpadding="4">  
                               
                                <h:outputText value="Nome:" />  
                                <p:inputText value="#{fabricanteMB.fabricante.nome}" /> 

                                <h:outputText value="Telefone" />  
                                <p:inputText value="#{fabricanteMB.fabricante.telefone}"/>

                                <h:outputText value="Email" />
                                <p:inputText value="#{fabricanteMB.fabricante.email}" />

                            </h:panelGrid> 
                            <p:separator/>
                            <fieldset id="barraBotoes">
                                <p:commandButton value="OK" actionListener="#{fabricanteMB.salvar()}" oncomplete="cadFabricante.hide();" update="dataTableCadFrabricantes,growl,dlgCadastrarFab" />
                                <p:commandButton value="Cancelar" onclick="cadFabricante.hide();" update="@this"/>
                            </fieldset>
                        </p:dialog> 

                    </h:form>
                </p:panel>
            </ui:define>
        </ui:composition>
    </h:body>
</html>

Abaixo meu bean:


@ManagedBean(name = "fabricanteMB")
@RequestScoped
public class GerenciamentoFabricanteMB implements InterfaceGerenciamentoFabricante {

    private Fabricante fabricante;
    private FabricanteDataModel fabricanteDataModel;

    public GerenciamentoFabricanteMB() {
        this.fabricante = new Fabricante();
        carregaDataTable();
    }

    public void salvar() {
        System.out.println("Chamou método para cadastro.");
    }

    public void editar(Long idFabricante) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void deletar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void buscarFabricantes() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    private void carregaDataTable() {
        InterfaceDao<Fabricante> interfaceDao = new FabricanteDaoImp();
        this.fabricanteDataModel = new FabricanteDataModel(interfaceDao.findAll());
    }

    public Fabricante getFabricante() {
        return fabricante;
    }

    public void setFabricante(Fabricante fabricante) {
        this.fabricante = fabricante;
    }

    public FabricanteDataModel getFabricanteDataModel() {
        return fabricanteDataModel;
    }

    public void setFabricanteDataModel(FabricanteDataModel fabricanteDataModel) {
        this.fabricanteDataModel = fabricanteDataModel;
    }
}

Abaixo minha classe para carregar a dataTable

public class FabricanteDataModel extends ListDataModel<Fabricante> implements SelectableDataModel<Fabricante>, Serializable {

    private List<Fabricante> listaFabricantes;

    public FabricanteDataModel() {
    }

    public FabricanteDataModel(List<Fabricante> fabricantes) {
        super(fabricantes);
        this.listaFabricantes = fabricantes;
    }

    public Object getRowKey(Fabricante t) {
        return t.getIdFabricante();
    }

    public Fabricante getRowData(String string) {
        this.listaFabricantes = (List<Fabricante>) getWrappedData();
        for (Fabricante fabricante : this.listaFabricantes) {
            if (!string.equals("null")) {
                if (fabricante.getIdFabricante().equals(Long.valueOf(string))) {
                    return fabricante;
                }
            }


        }
        return null;
    }

    public List<Fabricante> getListaFabricantes() {
        return listaFabricantes;
    }

    public void setListaFabricantes(List<Fabricante> listaFabricantes) {
        this.listaFabricantes = listaFabricantes;
    }
}

Os dados estão sendo exibidos na dataTable certinho, o problema e que quando clico no botão “Cadastrar” meu método “salvar” não e chamado, não estou entendendo porque ele não esta sendo chamado, se alguem puder me ajudar a agradeço, estou usando a versão 3.4 do prime e o jsf 2x.

Tente assim

 actionListener="#{fabricanteMB.salvar}"

//o método:
public void salvar(ActionEvent event){
...
}

Quando for utilizar actionListener, o método deve receber um actionEvent e deve ser uma void. Caso utilize apenas action, o método não recebe parametros e deve retornar uma String.

Fiz como sugeriu, mesmo assim ainda não esta chamando meu método, na vardade ele aciona o bean porem somente o que esta no construtor parece ser executado, ele executa o que esta no construtor pronto, não chama meu método salvar, sabe o que pode ser, tem alguma coisa a ver com o scopo ou algo do tipo, sou novato no jsf.

cara…

acredito que vc não precisa colocar salvar(),

coloque só salvar,

cara vc está chamando o ActionEvent do pacote certo???

tem o ActionEvent do pacote awt…

vc tem que usar eventos da classe do jsf…

falow

O ActionEvent esta sendo chamado do pacote certo.

coloque a parte dos imports…

falow

import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.event.ActionEvent;

Esses são os importes do meu MB.

ele está chamando o metodo deletar???

[]s

Não.

Descobri uma coisa, quando executo minha aplicação no browser aparece o seguinte caminho:
http://localhost:8084/ExemplosPrimeFacesJSF2

Quando clico no item de menu “Fornecedores” a url continua a mesma, dai meus métodos não são chamados no meu bean, porem quando executo somente a página, meu métodos são invocados corretamento no bean, dai a url muda para http://localhost:8084/ExemplosPrimeFacesJSF2/jsp/cadastros/cadastrosFornecedores.jsf quando a url esta completa funciona tudo certinho, alguem sabe o motivo disso estar acontecendo?

abaixo segue meu faces-config:

<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.1"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd">

    <navigation-rule>
        <navigation-case>
            <from-outcome>cadastroFornecedores</from-outcome>
            <to-view-id>/jsp/cadastros/cadastrosFornecedores.jsf</to-view-id>
        </navigation-case>
    </navigation-rule>
</faces-config>

Abaixo segue a chamada da página:

<p:menuitem value="Fornecedores" action="cadastroFornecedores"/> 

Conto com a ajuda de todos.

A sintaxe está incorreta, o actionEvent é opcional, caso vc precise usar algum atributo dele. O correto é #{bean.metodo}.