Pessoal,
Não sei porque, mas meu commandButton só está salvando se eu clicá-lo duas vezes.
Ainda não achei o motivo desse problema e gostaria de solucioná-lo o mais rápido possível.
Segue o meu código:
<h:form id="formManterProduto">
<p:focus for="nome"/>
<table>
<tr>
<td>
<h:outputLabel for="codigo" value="Código:" styleClass="labelNegrito"
rendered="#{produtoController.produto.id != null}"/>
</td>
<td>
<h:inputText id="codigo" value="#{produtoController.produto.id}"
disabled="true" size="10" rendered="#{produtoController.produto.id != null}"/>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="nome" value="Produto (*):" styleClass="labelNegrito"/>
</td>
<td>
<p:inputMask id="nome" value="#{produtoController.produto.nome}"
mask="" size="60" maxlength="200"
required="true"
requiredMessage="Por favor, digite o nome do produto."/>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="descricao" value="Descrição:" styleClass="labelNegrito"/>
</td>
<td>
<p:inputMask id="descricao" value="#{produtoController.produto.descricao}"
mask="" size="60" maxlength="200"/>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="categoria" value="Categoria (*):" styleClass="labelNegrito"/>
</td>
<td>
<p:selectOneMenu id="listaCategorias" widgetVar="listaCategorias"
value="#{produtoController.produto.subCategoria.categoria}"
converter="categoriaConverter"
required="true"
requiredMessage="Por favor, selecione uma categoria.">
<f:selectItem itemLabel="Selecione..."/>
<f:selectItems value="#{categoriaController.listaCategoriasParaCombobox}"/>
</p:selectOneMenu>
<p:spacer width="10"/>
<p:commandLink value="[+] Nova Categoria"
title="Incluir uma nova categoria"
action="#{categoriaController.prepararParaIncluir}"
oncomplete="incluirCategoriaDialog.show()"
update=":formNovaCategoria"
immediate="true"/>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="subCategoria" value="Subcategoria (*):" styleClass="labelNegrito"/>
</td>
<td>
<p:selectOneMenu id="subCategorias" widgetVar="subCategorias"
value="#{produtoController.produto.subCategoria}"
converter="subCategoriaConverter"
required="true"
requiredMessage="Por favor, selecione uma subcategoria.">
<f:selectItem itemLabel="Selecione..."/>
<f:selectItems value="#{subCategoriaController.listaSubCategoriasParaCombobox}"/>
</p:selectOneMenu>
<p:spacer width="10"/>
<p:commandLink value="[+] Nova Subcategoria"
title="Incluir uma nova subcategoria"
action="#{subcategoriaController.prepararParaIncluir}"
oncomplete="incluirSubCategoriaDialog.show()"
update=":formNovaSubCategoria"
immediate="true"/>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="unidade" value="Unidade (*):" styleClass="labelNegrito"/>
</td>
<td>
<p:selectOneMenu id="listaUnidades" widgetVar="listaUnidades"
value="#{produtoController.produto.unidade}"
converter="unidadeConverter"
required="true"
requiredMessage="Por favor, selecione uma unidade.">
<f:selectItem itemLabel="Selecione..."/>
<f:selectItems value="#{unidadeController.listaUnidadesParaCombobox}"/>
</p:selectOneMenu>
<p:spacer width="10"/>
<p:commandLink value="[+] Nova Unidade"
title="Incluir uma nova unidade"
action="#{unidadeController.prepararParaIncluir}"
oncomplete="incluirUnidadeDialog.show()"
update=":formNovaUnidade"
immediate="true"/>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="estoqueMinimo" value="Estoque Mínimo (*):" styleClass="labelNegrito"/>
</td>
<td>
<p:inputMask id="estoqueMinimo" value="#{produtoController.produto.estoqueMin}"
mask="9?9999" size="8" maxlength="11"
required="true"
requiredMessage="Por favor, informe um estoque mínimo."/>
<p:spacer width="20"/>
<h:outputLabel for="estoqueMaximo" value="Estoque Máximo:" styleClass="labelNegrito"/>
<p:spacer width="10"/>
<p:inputMask id="estoqueMaximo" value="#{produtoController.produto.estoqueMax}"
mask="9?9999" size="8" maxlength="11"/>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="localizacao" value="Localização:" styleClass="labelNegrito"/>
</td>
<td colspan="3">
<p:inputMask id="localizacao"
value="#{produtoController.produto.localizacao}"
mask="" size="60" maxlength="200"/>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="perecivel" value="Perecível (*):" styleClass="labelNegrito"/>
</td>
<td>
<p:selectOneMenu id="perecivel" value="#{produtoController.produto.perecivel}"
required="true"
requiredMessage="Por favor, informe se o produto é perecível.">
<f:selectItem itemValue="" itemLabel="Selecione..."/>
<f:selectItem itemValue="false" itemLabel="Não"/>
<f:selectItem itemValue="true" itemLabel="Sim"/>
</p:selectOneMenu>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="ativo" value="Ativo (*):" styleClass="labelNegrito"/>
</td>
<td>
<p:selectOneMenu id="ativo" value="#{produtoController.produto.ativo}"
required="true"
requiredMessage="Por favor, informe se o produto está ativo.">
<f:selectItem itemValue="" itemLabel="Selecione..."/>
<f:selectItem itemValue="true" itemLabel="Sim"/>
<f:selectItem itemValue="false" itemLabel="Não"/>
</p:selectOneMenu>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="obs" value="Observações:" styleClass="labelNegrito"/>
</td>
<td>
<p:inputMask id="obs" value="#{produtoController.produto.obs}"
mask="" maxlength="150" size="60"/>
</td>
</tr>
</table>
<p:messages autoUpdate="true" redisplay="true"/>
<p:commandButton icon="ui-icon-disk" value="Salvar"
action="#{produtoController.salvar}"
update=":formManterProduto"/>
<p:commandButton icon="ui-icon-close" value="Cancelar"
onclick="manterProdutoDialog.hide()"
update=":formPrincipal"
immediate="true"/>
</h:form>
Se precisarem dos models e dos controllers, para facilitar a descoberta desse problema, é só falar.
Desde já agradeço.
** O problema está no commandButton de salvar:
<p:commandButton icon="ui-icon-disk" value="Salvar"
action="#{produtoController.salvar}"
update=":formManterProduto"/>