Declaração de beans compostos no faces-config.xml

Pessoal,

Segue, abaixo, o código da minha classe PessoaBean

public class PessoaBean {
	
	String nome;
	String idade;
	ArrayList<String> generosMusicais;
	EnderecoBean endereco;
	ArrayList<TelefoneBean> telefone;
	
	public PessoaBean() {
		
	}
        /* metodos get e set */
}

E abaixo o código do faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer
Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<managed-bean>
	<managed-bean-name>Pessoa</managed-bean-name>
	<managed-bean-class>beans.PessoaBean</managed-bean-class>
	<managed-bean-scope>request</managed-bean-scope>
	<managed-property>  
		<property-name>nome</property-name>  
        	<value>Max William</value>  
	</managed-property>  
	<managed-property>  
		<property-name>idade</property-name>  
        <value>38</value>  
    </managed-property>  
	<managed-property>  
		<property-name>generosMusicais</property-name>  
        	<list-entries>  
            	<value>Rock</value>  
            	<value>Reggae</value>  
            	<value>Pop</value>  
        	</list-entries>  
	</managed-property>
	<managed-property>
		<property-name>endereco</property-name>
		<value>#{EnderecoBean}</value>
	</managed-property>
	<managed-property>
		<property-name>telefone</property-name>
		<value>#{TelefoneBean}</value>
	</managed-property>	
</managed-bean>	
<managed-bean>
	<managed-bean-name>EnderecoBean</managed-bean-name>
	<managed-bean-class>beans.EnderecoBean</managed-bean-class>
	<managed-bean-scope>none</managed-bean-scope>
	<managed-property>
		<property-name>logradouro</property-name>
		<value>Avenida Epitário Pessoa></value>
	</managed-property>
	<managed-property>
		<property-name>numero</property-name>
		<value>450</value>
	</managed-property>
	<managed-property>
		<property-name>cep</property-name>
		<value>58000-000</value>
	</managed-property>
</managed-bean>
<managed-bean>	
	<managed-bean-name>TelefoneBean</managed-bean-name>
	<managed-bean-class>beans.TelefoneBean</managed-bean-class>
	<managed-bean-scope>none</managed-bean-scope>
	<managed-property>
		<property-name>tipo</property-name>
		<value>fixo</value>
	</managed-property>
	<managed-property>
		<property-name>numero</property-name>
		<value>3224-6123</value>
	</managed-property>
	<managed-property>
		<property-name>tipo</property-name>
		<value>celular OI</value>
	</managed-property>
	<managed-property>
		<property-name>numero</property-name>
		<value>8888-5555</value>
	</managed-property>
	<managed-property>
		<property-name>tipo</property-name>
		<value>celular TIM</value>
	</managed-property>
	<managed-property>
		<property-name>numero</property-name>
		<value>999-444</value>
	</managed-property>
</managed-bean>  
<navigation-rule>
	<from-view-id>/PessoaFormBean.jsp</from-view-id>
	<navigation-case><from-outcome>exibe</from-outcome>
		<to-view-id>/exibeBean.jsp</to-view-id>
	</navigation-case>
</navigation-rule>
</faces-config>

Está acontecendo o erro
“Bean propoerty endereco not found on parent class beans.EnderecoBean”
no trecho

<managed-property>
		<property-name>endereco</property-name>
		<value>#{EnderecoBean}</value>
</managed-property>

Analogamente, também acontece o erro
“Bean propoerty telefone not found on parent class beans.TelefoneBean”

<managed-property>
		<property-name>telefone</property-name>
		<value>#{TelefoneBean}</value>
</managed-property>	

Será que houve algum erro na modelagem da minha associação na classe PessoaBean ou
é apenas um questão de sintaxe ?

Agradece,

Max William

UP

No caso do telefone eu achei um erro:
O atributo (na classe Pessoa) está declarado como ArrayList, e no faces-config você tenta injetar um TelefoneBean.

Infelizmente não consegui descobrir o que acontece com o Endereco…

Consegui “resolver” o problema da sintaxe. Não me perguntem como.
De vez em quando a IDE acusa esse erro de sintaxe, eu fecho o projeto, encerro a IDE. E outra hora quando volto tá tudo OK, dá para entender ?
Só que agora ao tentar executar o arquivo PessoaFormBean.jsp, o gato Tom fica com raiva de mim e acusa o seguinte erro :

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException: Unable to create managed bean Pessoa.  The following problems were found:
     - Property endereco for managed bean Pessoa does not exist.
     - Property telefone for managed bean Pessoa does not exist.
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:270)


root cause 

com.sun.faces.mgbean.ManagedBeanCreationException: Unable to create managed bean Pessoa.  The following problems were found:
     - Property endereco for managed bean Pessoa does not exist.
     - Property telefone for managed bean Pessoa does not exist.
	com.sun.faces.mgbean.BeanManager.create(BeanManager.java:204)
	com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:88)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
	com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
	org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:61)
	org.apache.el.parser.AstValue.getValue(AstValue.java:107)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)
	javax.faces.component.UIOutput.getValue(UIOutput.java:184)
	com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:201)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:284)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:154)
	javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:861)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:242)
	com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:178)
	com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:126)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:837)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:936)
	javax.faces.render.Renderer.encodeChildren(Renderer.java:148)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:837)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:936)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:942)
	com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:271)
	com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:202)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:109)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.

Quanto à sugestão :
No caso do telefone eu achei um erro:
O atributo (na classe Pessoa) está declarado como ArrayList, e no faces-config você tenta injetar um TelefoneBean.

Vou discordar, pois em Coleções e Generics, até onde sei, é possível, sim, se ter um ArrayList de objetos de uma determinada classe.
Ainda continuo achando que o erro está na configuração dos beans no faces-config.xml

Agradeço d+ se conseguirem me ajudar a resolver este meu impasse.
[]'s
Max

Pessoal,

Aí vai uma errata, vou retirar o que disse neste trecho :

“Consegui “resolver” o problema da sintaxe. Não me perguntem como.
De vez em quando a IDE acusa esse erro de sintaxe, eu fecho o projeto, encerro a IDE. E outra hora quando volto tá tudo OK, dá para entender ?”

O problema da sintaxe acima mencionado ainda persisti sim, acabo de ver aqui.
Não vou repetir aqui, mas em cima eu citei o trecho de código do faces-config.xml, onde os erros de sintaxe são acusados e quais são estes erros.

Agradece,

Max

[quote=maxcarvalho]Quanto à sugestão :
No caso do telefone eu achei um erro:
O atributo (na classe Pessoa) está declarado como ArrayList, e no faces-config você tenta injetar um TelefoneBean.

Vou discordar, pois em Coleções e Generics, até onde sei, é possível, sim, se ter um ArrayList de objetos de uma determinada classe.
Ainda continuo achando que o erro está na configuração dos beans no faces-config.xml[/quote]

Não é isso não… acho que não me expliquei bem. Vou colocar aqui uns trechos do seu código:

Classe Pessoa:

public class PessoaBean { ArrayList<TelefoneBean> telefone; public ArrayList<TelefoneBean> getTelefone() {..} public void setTelefone(ArrayList<TelefoneBean> tel) {...} ... }
Declaração de Pessoa no faces-config:

<managed-bean> <managed-bean-name>Pessoa</managed-bean-name> <managed-bean-class>beans.PessoaBean</managed-bean-class> ... <managed-property> <property-name>telefone</property-name> <value>#{TelefoneBean}</value> </managed-property> </managed-bean>
Declaração do bean Telefone no faces-config:

<managed-bean> <managed-bean-name>TelefoneBean</managed-bean-name> <managed-bean-class>beans.TelefoneBean</managed-bean-class> <managed-bean-scope>none</managed-bean-scope> <managed-property> <property-name>tipo</property-name> <value>fixo</value> </managed-property> <managed-property> <property-name>numero</property-name> <value>3224-6123</value> </managed-property> <managed-property> <property-name>tipo</property-name> <value>celular OI</value> </managed-property> <managed-property> <property-name>numero</property-name> <value>8888-5555</value> </managed-property> <managed-property> <property-name>tipo</property-name> <value>celular TIM</value> </managed-property> <managed-property> <property-name>numero</property-name> <value>999-444</value> </managed-property> </managed-bean>

Repare no seguinte:

  • O atributo “telefone” de PessoaBean está declarado como ArrayList
  • O bean #{TelefoneBean} é declarado como tipo TelefoneBean
  • Pelo faces-config, você diz para injetar #{TelefoneBean} na propriedade telefone de PessoaBean.

Aí o que acaba acontecendo no Faces é o seguinte: ele tem o objeto #{TelefoneBean}, que é do tipo TelefoneBean.
A configuração diz para injetar esse valor na propriedade telefone do #{PessoaBean}, e é o que ele faz:

pessoaBean.setTelefone(telefoneBean)

Isso dá pau, pois o que existe é o método setTelefone(ArrayList ) e não setTelefone(TelefoneBean).

Resumindo o problema, você declarou que #{TelefoneBean} é um objeto da classe beans.TelefoneBean. Não é porque suas propriedades tipo e numero são setadas várias vezes que ele será uma lista de telefones.

Espero ter ajudado!

Ainda não entendi. Não tem como mapear da forma como eu estava tentando ?
Agradece,

Max

E o proplema ainda persiste…ainda estou apanhando com esses beans compostos

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer
Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<managed-bean>
	<managed-bean-name>PessoaBean</managed-bean-name>
	<managed-bean-class>beans.PessoaBean</managed-bean-class>
	<managed-bean-scope>session</managed-bean-scope>
			<managed-property>  
			<property-name>generosMusicais</property-name>  
        		<list-entries>  
            		<value>Rock</value>  
            		<value>Reggae</value>  
            		<value>Pop</value>  
        		</list-entries>  
		</managed-property>
		<managed-property>
			<property-name>endereco</property-name>
			<value>#{EnderecoBean}</value>
		</managed-property>
		<managed-property>
		<property-name>telefones</property-name>
		<value>#{TelefoneBean}</value>
	</managed-property>	
</managed-bean>		
<managed-bean>
	<managed-bean-name>EnderecoBean</managed-bean-name>
	<managed-bean-class>beans.EnderecoBean</managed-bean-class>
	<managed-bean-scope>session</managed-bean-scope>
	<managed-property>
		<property-name>logradouro</property-name>
		<value>Avenida Epitácio Pessoa</value>
	</managed-property>
	<managed-property>
		<property-name>numero</property-name>
		<value>450</value>
	</managed-property>
	<managed-property>
		<property-name>cep</property-name>
		<value>58030-110</value>
	</managed-property>
</managed-bean>
<managed-bean>	
	<managed-bean-name>TelefoneBean</managed-bean-name>
	<managed-bean-class>beans.TelefoneBean</managed-bean-class>
	<managed-bean-scope>session</managed-bean-scope>
	<managed-property>
		<property-name>tipo</property-name>
		<value>fixo</value>
	</managed-property>
	<managed-property>
		<property-name>numero</property-name>
		<value>3224-6123</value>
	</managed-property>
	<managed-property>
		<property-name>tipo</property-name>
		<value>celular OI</value>
	</managed-property>
	<managed-property>
		<property-name>numero</property-name>
		<value>8888-5555</value>
	</managed-property>
	<managed-property>
		<property-name>tipo</property-name>
		<value>celular TIM</value>
	</managed-property>
	<managed-property>
		<property-name>numero</property-name>
		<value>9999-4444</value>
	</managed-property>
</managed-bean>
<navigation-rule>
	<from-view-id>/PessoaFormBean.jsp</from-view-id>
	<navigation-case>
		<from-outcome>exibe</from-outcome>
		<to-view-id>/exibeBean.jsp</to-view-id>
	</navigation-case>
</navigation-rule>  
</faces-config>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>
	aula2</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet
		</servlet-class><load-on-startup> 1 </load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
	</servlet-mapping>
</web-app>

PessoaBean.java

package beans;
import java.util.ArrayList;

public class PessoaBean {
	
	private String nome;
	private Integer idade;
	private ArrayList<String> generosMusicais;
	private EnderecoBean endereco;
	private ArrayList<TelefoneBean> telefones = new ArrayList<TelefoneBean>();
	
	public PessoaBean() {
		
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Integer getIdade() {
		return idade;
	}

	public void setIdade(Integer idade) {
		this.idade = idade;
	}

	public ArrayList<String> getGenerosMusicais() {
		return generosMusicais;
	}

	public void setGenerosMusicais(ArrayList<String> generosMusicais) {
		this.generosMusicais = generosMusicais;
	}

	public EnderecoBean getEndereco() {
		return endereco;
	}

	public void setEndereco(EnderecoBean endereco) {
		this.endereco = endereco;
	}

	 public ArrayList<TelefoneBean> getTelefones() {
		return telefones;
	}

	public void setTelefones(ArrayList<TelefoneBean> telefones) {
		this.telefones = telefones;
	} 
	
}

TelefoneBean.java

package beans;

public class TelefoneBean {
	
	private String tipo;
	private String numero;
	
	public TelefoneBean() {
		
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}
	
}

PessoaFormBean.jsp

<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<f:view>
		<head>
		<title>Insert title here</title>
		</head>
		<body>
			<h:form>
				<h:panelGrid columns='2'>
					<h:outputText value='Nome:'/>
					<h:inputText value='#{PessoaBean.nome}'/>
					<h:outputText value='Idade:'/>
					<h:inputText value='#{PessoaBean.idade}'/>
					<h:commandButton type='submit' value='Enviar' action='exibe'/>
				</h:panelGrid>
			</h:form>
		</body>
</f:view>
</html>

exibeBean.jsp

<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
	Insert title here
</title>
</head>
	<body>
		<f:view>  
        	<h:outputText>Dados do Bean Pessoa</h:outputText> 
        	<br />
        	<h:outputText>--------------------</h:outputText> 
       		<br />  
         	<h:outputText value="Nome  : #{PessoaBean.nome}"></h:outputText>  
         	<br />   
         	<h:outputText value="Idade : #{PessoaBean.idade}"></h:outputText>  
         	<br/>    
         	<h:outputText value="Gêneros Musicais"></h:outputText>  
        	<br />  
         	<h:outputText value="1o gênero musical #{PessoaBean.generosMusicais[0]}"></h:outputText>  
         	<br />  
         	<h:outputText value="2o gênero musical #{PessoaBean.generosMusicais[1]}"></h:outputText>  
         	<br />  
         	<h:outputText value="3o gênero musical #{PessoaBean.generosMusicais[2]}"></h:outputText>
         	<br />  
			<h:outputText>Endereco :</h:outputText> 
         	<h:outputText value=" #{PessoaBean.endereco.logradouro}"></h:outputText>  
         	<h:outputText value=" nº #{PessoaBean.endereco.numero}"></h:outputText>
			<br />
         	<h:outputText value="CEP : #{PessoaBean.endereco.cep}"></h:outputText>
         	<br/>
         	<br/>    
         	<h:outputText value="Telefones"></h:outputText>
         	<br/>
         	<h:outputText value="1o telefone - Tipo   : #{PessoaBean.telefones[0].tipo}"></h:outputText> 
         	<br/> 
         	<h:outputText value="              Número : #{PessoaBean.telefones[0].numero}"></h:outputText>
         	<br />  
         	<h:outputText value="2o telefone - Tipo   : #{PessoaBean.telefones[1].tipo}"></h:outputText> 
         	<br/> 
         	<h:outputText value="              Número : #{PessoaBean.telefones[1].numero}"></h:outputText>
         	<br />
         	<h:outputText value="3o telefone - Tipo   : #{PessoaBean.telefones[2].tipo}"></h:outputText> 
         	<br/> 
         	<h:outputText value="              Número : #{PessoaBean.telefones[2].numero}"></h:outputText>
         	<br />      
     	</f:view>  	
	</body>
</html>

E o erro acusado é este :

HTTP Status 500 - 
--------------------------------------------------------------------------------
type Exception report

message 
description The server encountered an internal error () that prevented it from fulfilling this request.

exception 
javax.servlet.ServletException: Cannot convert beans.TelefoneBean@12e7c6a of type class beans.TelefoneBean to class java.util.ArrayList
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:277)

root cause 

java.lang.IllegalArgumentException: Cannot convert beans.TelefoneBean@12e7c6a of type class beans.TelefoneBean to class java.util.ArrayList

Ainda não entendi como vou resolver isto ?
Se alguém puder me ajudar, ficarei imensamente grato.
Agradece,

Max Carvalho