JSF não encontras as Classes

8 respostas
caiomacedor

Bom dia galera, estou estudando JSF e logo no primeiro exemplo ja estou tendo dificuldades, Então estou aqui novamente pra pedir socorro.
estou fazendo um exemplo que esta na revista Java Magazine Edição 72, Uma aplicação Livros Online. Criei todas as classes e JSPs conforme descrito nos exemplos. Mas na hora de publicar no TOMCAT ele não esta achando as classes java. um exemplo de exception: com.sun.faces.mgbean.ManagedBeanCreationException: Unable to create managed bean cliente. The following problems were found: - Bean or property class java.magazine.livroOnline.entidade.Cliente for managed bean cliente cannot be found.

Alguem mas experiente sabe me dizer o que falta ou o que esta errado?

8 Respostas

E

Opa

Então cara, poste ai o codigo que vc fez, das classes, jsp’s e arquivos de configuração.

A

Isso aí tá parecendo que você está tentando inicializar alguma propriedade que não existe de uma Managed Bean no faces-config.xml
Ou então temos um problema de packages e não existe a classe java.magazine.livroOnline.entidade.Cliente

caiomacedor
Classe Cliente:
package java.magazine.livroOnline.entidade;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.ForeignKey;

@Entity
@Table(name="CLIENTE")
public class Cliente {
	public enum Sexo{FEMININO, MASCULINO} 
	
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CLIENTE_SEQ")
	@SequenceGenerator(name = "CLIENTE_SEQ", sequenceName = "CLIENTE_SEQ", allocationSize = 1)
	private Long id;
	
	@Column(name = "NOME", length = 40, nullable = false)
	private String nome;
	
	@Column(name = "SOBRENOME", length = 40, nullable = false)
	private String sobrenome;
	
	@Column(name = "CPF", length = 12, nullable = false)
	private String cpf;
	
	@Column(name = "RG", length = 10, nullable = false)
	private String rg;
	
	@Column(name = "DTNASCIMENTO", length = 10, nullable = true)
	private Date dataNascimento;
	
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "SEXO", length = 1, nullable = false)
	private Sexo sexo;
	
	@Column(name = "EMAIL", length = 100, nullable = false)
	private String email;
	
	@Column(name = "SENHA", length = 16, nullable = false)
	private String senha;
	
	@Column(name = "ENDERECO", length = 60, nullable = false)
	private String endereco;
	
	@Column(name = "NUMERO", length = 4, nullable = false)
	private int numero;
	
	@Column(name = "COMPLETO", length = 20, nullable = true)
	private String complemento;
	
	@Column(name = "BAIRRO", length = 40, nullable = true)
	private String bairro;
	
	@ManyToOne(targetEntity = Municipio.class, fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_MUNICIPIO", nullable = false)
	@ForeignKey(name = "FK_CLIENTE_MUNICIPIO")
	private Municipio municipio;
	
	@ManyToOne(targetEntity = UnidadeFederativa.class, fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_UF", nullable = false)
	@ForeignKey(name = "FK_CLIENTE_UF")
	private UnidadeFederativa unidadeFederativa;
	
	@Column(name = "REFERENCIA_ENDERECO", length = 100, nullable = true)
	private String referencia;
	
	@Column(name = "TELEFONE", length = 12, nullable = true)
	private String telefone;
	
	@Column(name = "CELULAR", length = 12, nullable = true)
	private String celular;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getSobrenome() {
		return sobrenome;
	}
	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
	public String getRg() {
		return rg;
	}
	public void setRg(String rg) {
		this.rg = rg;
	}
	public Date getDataNascimento() {
		return dataNascimento;
	}
	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}
	public Sexo getSexo() {
		return sexo;
	}
	public void setSexo(Sexo sexo) {
		this.sexo = sexo;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public int getNumero() {
		return numero;
	}
	public void setNumero(int numero) {
		this.numero = numero;
	}
	public String getComplemento() {
		return complemento;
	}
	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}
	public String getBairro() {
		return bairro;
	}
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}
	public Municipio getMunicipio() {
		return municipio;
	}
	public void setMunicipio(Municipio municipio) {
		this.municipio = municipio;
	}
	public UnidadeFederativa getUnidadeFederativa() {
		return unidadeFederativa;
	}
	public void setUnidadeFederativa(UnidadeFederativa unidadeFederativa) {
		this.unidadeFederativa = unidadeFederativa;
	}
	public String getReferencia() {
		return referencia;
	}
	public void setReferencia(String referencia) {
		this.referencia = referencia;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	public String getCelular() {
		return celular;
	}
	public void setCelular(String celular) {
		this.celular = celular;
	}
	
	public Cliente() {}
	
	public boolean equals(Object obj) {
		if(super.equals(obj)) {
			return true;
		}
		else if(obj instanceof Cliente) {
			Cliente temp = (Cliente) obj;
			return temp.id == this.id;
		}
		return false;
	}
}
Classe Municipio:
package java.magazine.livroOnline.entidade;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "MUNICIPIO")
public class Municipio {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MUNICIPIO_SEQ")
	@SequenceGenerator(name = "MUNICIPIO_SEQ", sequenceName = "MUNICIPIO_SEQ", allocationSize = 1)
	private Long id;
	
	@Column(name = "DESCRICAO", length = 60, nullable = false)
	private String descricao;

	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
}
Classe UnidadeFederativa:
package java.magazine.livroOnline.entidade;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name="UNIDADEFEDERATIVA")
public class UnidadeFederativa {
	
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "UNIDADEFEDERATIVA_SEQ")
	@SequenceGenerator(name = "UNIDADEFEDERATIVA_SEQ", sequenceName = "UNIDADEFEDERATIVA_SEQ", allocationSize = 1)
	private Long id;
	
	@Column(name ="DESCRICAO")
	private String descricao;

	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
}
Classe ClienteBean:
package java.magazine.livroOnline.beans;

import java.io.Serializable;
import java.magazine.livroOnline.entidade.Cliente;
import java.magazine.livroOnline.entidade.UnidadeFederativa;
import java.magazine.livroOnline.entidade.Cliente.Sexo;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

public class ClienteBean implements Serializable {
	private static final long serialVersionUID = 1L;
	private List<SelectItem> municipios;
	private List<SelectItem> unidadesFederativas;
	private Cliente cliente;
	private String senhaConfirmacao;
	
	public ClienteBean() {}
	
	public void atualizaMunicipio(ValueChangeEvent vce) {
		cliente.setUnidadeFederativa((UnidadeFederativa) vce.getNewValue());
	}
	
	public String registrar() {
		if(!senhaConfirmacao.equals(cliente.getSenha())) {
			FacesMessage msg = new FacesMessage("A senha de confirmação não confere");
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			FacesContext.getCurrentInstance().addMessage(null, msg);
			return "erro";
		}
		
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Obrigado por se registrar ao Livros Online!"));
		FactoryDao.getClienteDao().criar(cliente);
		return "sucesso";
	}
	
	public List<SelectItem> getMunicipios(){
		if(municipios == null && cliente.getUnidadeFederativa() != null) {
			loadMunicipios();
		}
		else if(municipios == null) {
			return new ArrayList<SelectItem>();
		}
		return municipios;
	}

	private void loadMunicipios() {
		municipios = new ArrayList<SelectItem>();
		List<Municipio> entidades = FactoryDao.getMunicipioDao().findMunicipiosByUf(cliente.getUnidadeFederativa());
		for (Municipio municipio : entidades) {
			municipios.add(new SelectItem(municipio, municipio.getDescricao()));
		}
	}
	
	public List<SelectItem> getUnidadesFederativas() {
		if(unidadesFederativas == null) {
			unidadesFederativas = new ArrayList<SelectItem>();
			List<UnidadeFederativa> entidades = FactoryDao.getUnidadeFederativaDao().findAll();
			for (UnidadeFederativa uf : entidades) {
				unidadesFederativas.add(new SelectItem(uf, uf.getDescricao()));
			}
		}
		return unidadesFederativas;
	}
	
	public List<SelectItem> getOpcoesSexo(){
		List<SelectItem> itens = new ArrayList<SelectItem>();
		itens.add(new SelectItem(Sexo.FEMININO, "Feminino"));
		itens.add(new SelectItem(Sexo.MASCULINO, "Masculino"));
		return itens;
	}

}
Classe UnidadeFederativaConverter:
package java.magazine.livroOnline.converter;

import java.magazine.livroOnline.entidade.UnidadeFederativa;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

import org.hibernate.ObjectNotFoundException;

public class UnidadeFederativaConverter implements Converter {

	public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String str)throws ConverterException {
		UnidadeFederativa uf;
		try {
			Integer id = new Integer(str);
			if(id == null || id == 0) {
				return null;
			}
			uf = FactoryDao.getUnidadeFederativaDao.findById(id);
		} catch (NumberFormatException nfe) {
			throw new ConverterException(nfe);
		}catch (ObjectNotFoundException e) {
			throw new ConverterException("Estado não encontrado");
		}
		return uf;
	}

	public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object obj) throws ConverterException {
		if(obj == null) {
			return null;
		}
		else if(obj instanceof UnidadeFederativa) {
			UnidadeFederativa unidFed = (UnidadeFederativa) obj;
			return String.valueOf(unidFed.getId());
		}
		else {
			return null;
		}
	}
}
Classe EmailValidator:
package java.magazine.livroOnline.validators;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

public class EmailValidator implements Validator {

	public void validate(FacesContext context, UIComponent toValidate, Object valor) throws ValidatorException {
		Pattern mask = Pattern.compile(".+@.+\\.[a-z]+");
		Matcher matcher = mask.matcher((String) valor);
		if(matcher.matches()) {
			((UIInput) toValidate).setValid(false);
			FacesMessage message = new FacesMessage();
			message.setDetail("O Email é inválido");
			message.setSummary("O Email é inválido");
			message.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(toValidate.getClientId(context), message);
			//throw new ValidatorException(message);
		}
	}
}
JSP Casdastro:
<%@ page contentType="text/html; charset=ISO-8859-1" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<f:view>
	<body>
		<h:form>
			<fieldset>
				<div>
					<h:messages id="MensagensGlobais" globalOnly="true" errorClass="errorMessage" infoClass="successMessage" />
				</div>
				
				<p>
					<h:outputLabel value="Nome:" for="nome" />
					<h:inputText id="nome" value="#{cliente.nome}" required="true" maxlength="60" size="40" requiredMessage="Informe seu Nome" />
					<br /><h:message for="nome" styleClass="message" />
				</p>
				
				<p>
					<h:outputLabel value="Date de nascimento:" for="DataNascimento" />
					<h:inputText id="DataNascimento" value="#{cliente.dataNascimento}" maxlength="10" size="40" >
						<f:convertDateTime pattern="dd/MM/yyyy" />
					</h:inputText>
					<br /><h:message for="DataNascimento" styleClass="message" />
				</p>
				
				<p>
					<h:outputLabel value="Sexo:" for="sexo" />
					<h:selectOneRadio id="sexo" value="#{cliente.sexo}" required="true" requiredMessage="Sexo é obrigatório" styleClass="radio">
						<f:selectItems value="#{clienteBean.opcoesSexo}" />
					</h:selectOneRadio>
					<br /><h:message for="sexo" styleClass="message" />
				</p>
				
				<p>
					<h:outputLabel value="Estado:" for="estado" />
					<h:selectOneMenu id="uf" value="#{cliente.unidadeFederativa}" required="true" immediate="true" requiredMessage="Informe o Estado de seu Endereço" valueChangeListener="#{clienteBean.atualizaMunicipio}" onchange="submit()">
						<f:selectItem itemLabel="-- Selecionar --" />
						<f:selectItems value="#{clienteBean.unidadesFederativas}" />
					</h:selectOneMenu>
					<br /><h:message for="estado" styleClass="message" />
				</p>
				
				<p>
					<h:outputLabel value="Email:" for="email" />
					<h:inputText id="email" value="#{cliente.email}" required="true" maxlength="100" size="60" requiredMessage="É necessário informar um email válido para login">
						<%-- 
						<f:validator validatorId="jm.validator.email" />
						--%>
					</h:inputText>
					<br /><h:message for="email" styleClass="message" />
				</p>	
						
				<p>
					<h:outputLabel value="Senha:" for="senha" />
					<h:inputSecret id="senha" value="#{cliente.senha}" required="true" maxlength="16" size="20" requiredMessage="A senha é obrigatória" />
					<br /><h:message for="senha" styleClass="message" />
				</p>
				
				<p>
					<h:commandButton action="#{clienteBean.registrar}" value="Registrar" styleClass="ok" />
				</p>	
			</fieldset>
		</h:form>
	</body>
</f:view>

faces-config.xml:

<?xml version="1.0"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xi="http://www.w3.org/2001/XInclude"
 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_1_2.xsd">
	<converter>
		<converter-for-class>java.magazine.livroOnline.entidade.UnidadeFederativa</converter-for-class>
		<converter-class>java.magazine.livroOnline.converter.UnidadeFederativaConverter</converter-class>
	</converter>
	
	<managed-bean>
		<managed-bean-name>cliente</managed-bean-name>
		<managed-bean-class>java.magazine.livroOnline.entidade.Cliente</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	
	<managed-bean>
		<managed-bean-name>clienteBean</managed-bean-name>
		<managed-bean-class>java.magazine.livroOnline.beans.ClienteBean</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
		<managed-property>
			<property-name>cliente</property-name>
			<property-class>java.magazine.livroOnline.entidade.Cliente</property-class>
			<value>#{cliente}</value>
		</managed-property>
	</managed-bean>
	
	<navigation-rule>
		<from-view-id>/pages/registrar.jsp</from-view-id>
		<navigation-case>
			<from-outcome>sucesso</from-outcome>
			<to-view-id>/pages/areaCliente.jsp</to-view-id>
		</navigation-case>
		<navigation-case>
			<from-outcome>erro</from-outcome>
			<to-view-id>/pages/registrar.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
	
	<validator>
		<validator-id>jm.validator.email</validator-id>
		<validator-class>java.magazine.livroOnline.validators.EmailValidator</validator-class>
	</validator>

</faces-config>
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
	<display-name>Livros On Line</display-name>
	
	<context-param>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>client</param-value>
	</context-param>
	
	<context-param>
		<param-name>javax.faces.CONFIG_FILES</param-name>
		<param-value>/WEB-INF/faces-config.xml</param-value>
	</context-param>
	
	<listener>
		<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
	</listener>
	
	<!-- Faces Servlet -->
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<!-- Mapeamento Faces Servlet -->
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
	</servlet-mapping>
	
</web-app>
A

Acho que o problema está no faces-config:

<managed-bean>  
         <managed-bean-name>clienteBean</managed-bean-name>  
         <managed-bean-class>java.magazine.livroOnline.beans.ClienteBean</managed-bean-class>  
         <managed-bean-scope>request</managed-bean-scope>  
         <managed-property>  
             <property-name>cliente</property-name>  
             <property-class>java.magazine.livroOnline.entidade.Cliente</property-class>  
             <value>#{cliente}</value>  
         </managed-property>  
     </managed-bean>

Veja que aqui estamos tentando inicializar a propriedade “cliente” do bean clienteBean, que é uma instância da classe java.magazine.livroOnline.beans.ClienteBean. Só que não existe esta propriedade de forma acessível:

package java.magazine.livroOnline.beans;

import java.io.Serializable;
import java.magazine.livroOnline.entidade.Cliente;
import java.magazine.livroOnline.entidade.UnidadeFederativa;
import java.magazine.livroOnline.entidade.Cliente.Sexo;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

public class ClienteBean implements Serializable {
	private static final long serialVersionUID = 1L;
	private List<SelectItem> municipios;
	private List<SelectItem> unidadesFederativas;
	private Cliente cliente;
	private String senhaConfirmacao;
	
	public ClienteBean() {}
	
	public void atualizaMunicipio(ValueChangeEvent vce) {
		cliente.setUnidadeFederativa((UnidadeFederativa) vce.getNewValue());
	}
	
	public String registrar() {
		if(!senhaConfirmacao.equals(cliente.getSenha())) {
			FacesMessage msg = new FacesMessage("A senha de confirmação não confere");
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			FacesContext.getCurrentInstance().addMessage(null, msg);
			return "erro";
		}
		
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Obrigado por se registrar ao Livros Online!"));
		FactoryDao.getClienteDao().criar(cliente);
		return "sucesso";
	}
	
	public List<SelectItem> getMunicipios(){
		if(municipios == null && cliente.getUnidadeFederativa() != null) {
			loadMunicipios();
		}
		else if(municipios == null) {
			return new ArrayList<SelectItem>();
		}
		return municipios;
	}

	private void loadMunicipios() {
		municipios = new ArrayList<SelectItem>();
		List<Municipio> entidades = FactoryDao.getMunicipioDao().findMunicipiosByUf(cliente.getUnidadeFederativa());
		for (Municipio municipio : entidades) {
			municipios.add(new SelectItem(municipio, municipio.getDescricao()));
		}
	}
	
	public List<SelectItem> getUnidadesFederativas() {
		if(unidadesFederativas == null) {
			unidadesFederativas = new ArrayList<SelectItem>();
			List<UnidadeFederativa> entidades = FactoryDao.getUnidadeFederativaDao().findAll();
			for (UnidadeFederativa uf : entidades) {
				unidadesFederativas.add(new SelectItem(uf, uf.getDescricao()));
			}
		}
		return unidadesFederativas;
	}
	
	public List<SelectItem> getOpcoesSexo(){
		List<SelectItem> itens = new ArrayList<SelectItem>();
		itens.add(new SelectItem(Sexo.FEMININO, "Feminino"));
		itens.add(new SelectItem(Sexo.MASCULINO, "Masculino"));
		return itens;
	}

}

Estão faltando o getter e setter do cliente nesta classe. Algo assim:

public void setCliente( Cliente cliente ) {
    this.cliente = cliente;
}
public Cliente getCliente() {
    return this.cliente;
}
joede.fadel

Está faltando o construtor em suas páginas

public Clientes(){}
caiomacedor

joede.fadel tem o constructor sim… esta la na linha 195, como pode ver no codigo que postei assima.

E o resto do pessoal que respondeu… fiz tudo como vcs sugeriu mas nada. Não sobe de forma alguma. Gostaria muito de sanar essas duvidas pois vou iniciar num projeto que vai ser JSF. Muito obeigado pela a força galera.

caiomacedor

Galera, o arquivo faces-config.xml tem que ficar em qual pasta mesmo? O meu esta nesse local: /LivrosOnLine/WebContent/WEB-INF/faces-config.xml
isso esta certo?

caiomacedor

Galera, descobri o problema. Incrivél mas era o nome do package. O pacote pai antes tinha esse nome: java.magazine.livroOnline Ai dava erro em todas as classes. mudei para br.com.magazine.livroOnline ai rodou agora.

Criado 17 de novembro de 2009
Ultima resposta 17 de nov. de 2009
Respostas 8
Participantes 4