[RESOLVIDO]<a4j:commandButton> não passa os parâmetros para o bean

1 resposta
J

Olá a todos, estou aprendendo JSF porém me deparei com a seguinte situação:
a) tenho dois para dois possíveis parâmetros que serão passados ao bean.
b) um que deveria passar os parâmetros para meu bean, e inserí-los em uma lista.

O código dos Beans segue abaixo:

Genero.java
package com.anjho.pojo;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.validation.constraints.Min;
import javax.validation.constraints.Size;

@ManagedBean(name = "generoBean")
@ViewScoped
public class Genero implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Size(min = 2, message="O gênero especificado deve conter ao menos dois caracteres!")
	private String genero;
	
	@Min(value = 0, message="O código deve ser positivo!")
	private int gecode;

	public int getGecode() {
		return gecode;
	}

	public void setGecode(int gecode) {
		this.gecode = gecode;
	}

	public Genero() {
	}

	public Genero(int gecode, String genero) {
		this.gecode = gecode;
		this.genero = genero;
	}

	public String getGenero() {
		return genero;
	}

	public void setGenero(String genero) {
		this.genero = genero;
	}

}
ListaGeneroBean.java
package com.anjho.data;

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

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import com.anjho.pojo.Genero;

@ManagedBean(name = "listaGeneroBean")
@ViewScoped
public class ListaGeneroBean implements Serializable {

	private static final long serialVersionUID = 1L;
	private List<Genero> generoList = null;
	private Genero editedGenero;
	private int currentGeneroIndex;
	private int codeGenero;
	private String nomeGenero; 

	public int getCodeGenero() {
		return codeGenero;
	}

	public void setCodeGenero(int codeGenero) {
		this.codeGenero = codeGenero;
	}

	public String getNomeGenero() {
		return nomeGenero;
	}

	public void setNomeGenero(String nomeGenero) {
		this.nomeGenero = nomeGenero;
	}

	public List<Genero> getGeneroList() {
		synchronized (this) {
			if (this.generoList == null) {
				this.generoList = new ArrayList<Genero>();
				generoList.add(new Genero(0, "Teste1"));
				generoList.add(new Genero(1, "Teste2"));
				generoList.add(new Genero(2, "Teste3"));
			}
			return generoList;
		}
	}

	public void setGeneroList(List<Genero> generoList) {
		this.generoList = generoList;
	}

	public Genero getEditedGenero() {
		return editedGenero;
	}

	public void setEditedGenero(Genero editedGenero) {
		this.editedGenero = editedGenero;
	}

	public int getCurrentGeneroIndex() {
		return currentGeneroIndex;
	}

	public void setCurrentGeneroIndex(int currentGeneroIndex) {
		this.currentGeneroIndex = currentGeneroIndex;
	}

	public void onApagarClick() {
		generoList.remove(generoList.get(currentGeneroIndex));
	}

	public void onSalvarClick() {
		generoList.set(currentGeneroIndex, editedGenero);
	}

	public void onCadastrarClick() {
		generoList.add(new Genero(codeGenero, nomeGenero));
	}

}
E, o código da página que estou tentando desenvolver é este:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich">

	<h:outputStylesheet>
		a.no-decor>img {
			border: none;
		}
	</h:outputStylesheet>

	<a4j:status onstart="#{rich:component('statPane')}.show()"
		onstop="#{rich:component('statPane')}.hide()" />

	<f:view>
		<h:head></h:head>
		<h:body>
			<rich:panel header="Cadastro de gêneros de exemplares">
				<h:form>
					<rich:panel style="border-width:0;">
						<h:panelGrid columns="3">
							<h:outputLabel id="lblGenero" value="Gênero: " />
							<h:inputText id="txtGenero" value="#{generoBean.genero}">
								<rich:validator event="keyup" />
							</h:inputText>
							<rich:message for="txtGenero" />
							<h:outputLabel id="lblCodigo" value="Código: " />
							<h:inputText id="txtCodigo" value="#{generoBean.gecode}">
								<rich:validator event="keyup" />
							</h:inputText>
							<rich:message for="txtCodigo" />
							<h:outputText value="&#160;" />
							<a4j:commandButton id="btnCadastrar" value="Cadastrar"
								action="#{listaGeneroBean.onCadastrarClick}"
								execute="@this" render="tblGeneros">
								<a4j:param value="#{generoBean.genero}"
										assignTo="#{listaGeneroBean.nomeGenero}" />
								<a4j:param value="#{generoBean.gecode}"
										assignTo="#{listaGeneroBean.codeGenero}" />
								<f:setPropertyActionListener
										target="#{listaGeneroBean.editedGenero}" value="#{generoBean}" />
							</a4j:commandButton>
						</h:panelGrid>
					</rich:panel>
					<rich:panel header="Gêneros cadastrados:">
						<rich:extendedDataTable value="#{listaGeneroBean.generoList}"
							var="gen" id="tblGeneros" iterationStatusVar="it" width="100%">
							<rich:column>
								<f:facet name="header">
									<h:outputText value="CÓDIGO" />
								</f:facet>
								<h:outputText value="#{gen.gecode}" />
							</rich:column>
							<rich:column>
								<f:facet name="header">
									<h:outputText value="GÊNERO" />
								</f:facet>
								<h:outputText value="#{gen.genero}" />
							</rich:column>
							<rich:column>
								<a4j:commandLink styleClass="no-decor" execute="@this"
									render="@none"
									oncomplete="#{rich:component('confirmPane')}.show()">
									<h:graphicImage value="/images/icons/delete.gif" alt="delete" />
									<a4j:param value="#{it.index}"
										assignTo="#{listaGeneroBean.currentGeneroIndex}" />
								</a4j:commandLink>
								<a4j:commandLink styleClass="no-decor" render="editGrid"
									execute="@this"
									oncomplete="#{rich:component('editPane')}.show()">
									<h:graphicImage value="/images/icons/edit.gif" alt="edit" />
									<a4j:param value="#{it.index}"
										assignTo="#{listaGeneroBean.currentGeneroIndex}" />
									<f:setPropertyActionListener
										target="#{listaGeneroBean.editedGenero}" value="#{gen}" />
								</a4j:commandLink>
							</rich:column>
						</rich:extendedDataTable>
					</rich:panel>
					<a4j:jsFunction name="remove" action="#{listaGeneroBean.onApagarClick}"
						render="tblGeneros" execute="@this"
						oncomplete="#{rich:component('confirmPane')}.hide();" />
					<rich:popupPanel id="statPane" autosized="true">
						<h:graphicImage value="/images/ai.gif" alt="ai" />
							Aguarde...
					</rich:popupPanel>
					<rich:popupPanel id="confirmPane" autosized="true">
						Tem certeza que deseja apagar este gênero?
						<a4j:commandButton value="Cancelar"
							onclick="#{rich:component('confirmPane')}.hide(); return false;" />
						<a4j:commandButton value="Apagar"
							onclick="remove(); return false;" />
					</rich:popupPanel>
					<rich:popupPanel header="Detalhes do gênero a ser editado:"
						id="editPane" domElementAttachment="parent" autosized="true">
						<h:outputText value="gênero: " />
						<h:inputText value="#{listaGeneroBean.editedGenero.genero}" />
						<a4j:commandButton value="Salvar"
							action="#{listaGeneroBean.onSalvarClick}" render="tblGeneros"
							execute="editPane"
							oncomplete="if (#{facesContext.maximumSeverity==null}) {#{rich:component('editPane')}.hide();}" />
						<a4j:commandButton value="Cancelar"
							onclick="#{rich:component('editPane')}.hide(); return false;" />
					</rich:popupPanel>
				</h:form>
			</rich:panel>
		</h:body>
	</f:view>
</ui:composition>

Não consigo entender por qual motivo o botão "Cadastrar" não está passando os parâmetros para o bean. No degug, os parâmetros os quais estou utilizando aparecem 0 para o int e vazio para a String, como se o bean não capturasse os parâmetros que estou passando.

Alguém pode me ajudar?
Desde já agradeço.

1 Resposta

J

Olá pessoal, consegui resolver o problema colocando um atributo [color=red]“execute”[/color] no botão.

Para alguém q tenha algum problema parecido, ficará algo assim:

...
<a4j:commandButton id="btnCadastrar" value="Cadastrar"
	action="#{listaGeneroBean.onCadastrarClick}" execute="cadPanel"
	render="@form">
</a4j:commandButton>
...
Criado 24 de agosto de 2011
Ultima resposta 26 de ago. de 2011
Respostas 1
Participantes 1