commandButton primefaces só executa método do bean quando está sozinho dentro do form

2 respostas
tiago_bean

Caros Web Desenvolvedores

Estou com o seguinte problema: quando utilizo apenas o componente dentro de um o método no bean é executado, porém quando utilizo outros componentes primafaces juntamente com o dentro do o método do bean não é executado, como no exemplo abaixo:

funcionando
<h:form>
                <p:commandButton update="selects" value="Adicionar Item de Kit" icon="ui-icon-disk" styleClass="BtCorpoPainel" actionListener="#{kitSalvarBean.adicionarItem}"/>

</h:form>
Sem funcionar
<h:form>
                <table>
                    <tr>
                        <td>Produto<p:autoComplete id="pesquisaProduto" value="#{kitSalvarBean.produtoSelecionado}" minQueryLength="3" required="true"
                                                   var="p" itemLabel="#{p.nome}" itemValue="#{p}" forceSelection="true"
                                                   completeMethod="#{kitSalvarBean.completarProduto}" converter="produtoConverter"
                                                   requiredMessage="Selecione um produto" /></td>
                    </tr>
                    <tr>
                        <td>Quantidade Produto<h:inputText value="#{kitSalvarBean.quantidadeProduto}" required="true"       requiredMessage="Informe a quantidade"/></td>
                    </tr>
                </table>

                <p:commandButton update="selects" value="Adicionar Item de Kit" icon="ui-icon-disk" styleClass="BtCorpoPainel" actionListener="#{kitSalvarBean.adicionarItem}"/>
                <ui:repeat id="selects" var="i" value="#{kitSalvarBean.itens}">
                    <div>
                        <h:outputText value="#{i.produto.referencia}" >

                        </h:outputText>

                        <h:outputText value="#{i.produto.nome}">
                        </h:outputText>

                        <h:outputText value="#{i.quantidade}">

                        </h:outputText>

                    </div>
                </ui:repeat>
                <table >
                    <tr>
                        <td>Nome<h:inputText value="#{kitSalvarBean.kit.nome}" required="true" requiredMessage="Informe o nome do kit"/></td>
                    </tr>
                    <tr>
                        <td>Tag<h:inputText value="#{kitSalvarBean.kit.tag}" required="true" requiredMessage="Informe a tag do kit"/></td>
                    </tr>
                    <tr>
                        <td>Desconto<h:inputText value="#{kitSalvarBean.kit.desconto}" required="true" requiredMessage="Informe o desconto do kit"/></td>
                    </tr>
                </table>

            </h:form>
Bean
package br.com.bean.kit;


@ManagedBean
@RequestScoped
public class KitSalvarBean implements Serializable {

    private Kit kit;
    private Produto produtoSelecionado;
    private HashMap<Integer, ProdutoKit> itens;
    private KitRN kitRN;
    private int quantidadeProduto;

    /**
     * Creates a new instance of KitSalvarBean
     */
    public KitSalvarBean() {
        kit = new Kit();
        itens = new HashMap<Integer, ProdutoKit>();
    }

    public String salvar() {
        kitRN = new KitRN();
        try {
            kit.setProdutoKitList((List<ProdutoKit>) itens.values());
            kitRN.salvar(kit);
            Util.getInstance().setarMsgBundle("cadastrokit", FacesMessage.SEVERITY_INFO);
        } catch (ApplicationException ex) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Exceção de Negócio", ex);
            Util.getInstance().setarMsgBundle(ex.getMensagem(), FacesMessage.SEVERITY_INFO);
        }

        return Navegacao.KITPRODUTO.getEndereco();
    }

    public List<Produto> completarProduto(String pesquisa) {
        kitRN = new KitRN();
        return kitRN.produtoAutoComplete(pesquisa);

    }

    public Kit getKit() {
        return kit;
    }

    public void setKit(Kit kit) {
        this.kit = kit;
    }

    public String carregarCadastroKit() {
        return Navegacao.KITPRODUTONOVO.getEndereco();
    }

    public List<ProdutoKit> getItens() {
        return new ArrayList<ProdutoKit>(itens.values());
    }

    public Produto getProdutoSelecionado() {
        return produtoSelecionado;
    }

    public void setProdutoSelecionado(Produto produtoSelecionado) {
        this.produtoSelecionado = produtoSelecionado;
    }


    public void adicionarItem() {
        ProdutoKit produtoKit = new ProdutoKit();
        Produto produto;
        int quantidade;
        if (produtoSelecionado != null) {
            if (itens.get(produtoSelecionado.getCodigo()) != null) { //produto ja adicionado
                produtoKit = itens.get(produtoSelecionado.getCodigo());
                quantidade = produtoKit.getQuantidade();
                produtoKit.setQuantidade(quantidade + quantidadeProduto);
            } else {
                produto = new Produto();
                produto.setCodigo(produtoSelecionado.getCodigo());
                produtoKit.setQuantidade(quantidadeProduto);
                produtoKit.setProduto(produto);
                itens.put(produtoSelecionado.getCodigo(), produtoKit);
                produtoSelecionado = new Produto();
            }
        }

    }

    public int getQuantidadeProduto() {
        return quantidadeProduto;
    }

    public void setQuantidadeProduto(int quantidadeProduto) {
        this.quantidadeProduto = quantidadeProduto;
    }
}

Desculpe se já existir um tópico semelhante.

Versões da tecnologia
Jsf 2.1, primefaces 3.2, toncat 7.027

2 Respostas

fer.ferreira6

Seu ManagedBean é do tipo Request, porém, você seleciona um produto no autoComplete, depois insere a quantidade do produto, e depois manda adicionar o produto.
Imagino que quando manda adicionar, seu produto e a quantidade já não existam mais no ManagedBean.

Chegou a colocar um breakpoint no seu método adicionarItem para ver o que acontece nele?
Gera algum erro?

Dependendo do que acontecer, pode mudar seu ManagedBean para ViewScoped ou SessionScoped, dependendo do tempo que precisa desses objetos.

tiago_bean

Cheguei a debugar o código, mas ele não chama o método se conter outros componentes dentro do form. Tb cheguei a testar com view scope e nada. Gostaria de usar o button via ajax para adicionar os itens.

Criado 13 de julho de 2013
Ultima resposta 15 de jul. de 2013
Respostas 2
Participantes 2