[RESOLVIDO] Enviar valor pra backing bean: RichFaces

14 respostas
tati.mat.moreira

Oi pessoal,

estou usando o suggestion do Faces. Ele está buscando os registros do banco certinho e preenchendo o input quando eu clico. O que eu não consigo fazer é pegar o id da pessoa que foi escolhida e enviar para
meu backing bean. Se eu conseguir enviar o id eu consiguirei terminar a minha pesquisa com o método load(), pois ele está funcionando certinho. Segue o código:
pagina:

<f:facet name="header">Nome </f:facet>
     <h:inputText value="#{pessoaFisicaFace.pessoaFisica.nome}" id="text" /><br/>
         <rich:suggestionbox 
                   id="suggestionBoxId" 
                   var="fisica" 
                   for="text" 
                   fetchValue="#{pessoaFisicaFace.pessoaFisica.nome}" 
                   suggestionAction="#{pessoaFisicaFace.autocomplete}">
                   <h:column>
                      <h:outputText value="#{fisica}"/>
                   </h:column>
               </rich:suggestionbox><br/>

               <h:commandButton value="Pesquisar" action="#{pessoaFisicaFace.load}" styleClass="botoes">
                     <f:setPropertyActionListener value="#{fisica.id}" target="#{pessoaFisicaFace.id}" /><br/>
              </h:commandButton>

backing bean:

public class PessoaFisicaFace {

       private PessoaFisica pessoaFisica = new PessoaFisica();

       private Long id;

       public String load(){
               Session session = HibernateUtil.currentSession();
               Dao<PessoaFisica> dao = new Dao<PessoaFisica>(session, PessoaFisica.class);

               pessoaFisica = dao.load(id);

               System.out.println("id >>>>>>>>>>>>> " + id);

               if(id.equals(pessoaFisica.getId())){
                       return "pesquisaSucesso";
               }else{
                       return "pesquisaPessoaFisicaAction";
               }
       }

       public List autocomplete(Object busca){
               Session session = HibernateUtil.currentSession();
               PessoaFisicaDao dao = new PessoaFisicaDao(session);

               return dao.pesquisaPessoasFisicasByName(busca);
       }

       ...
}

Agradeço!

14 Respostas

rsakurai

Usa o actionparam dentro do suggestionbox

<rich:suggestionbox   
  id="suggestionBoxId"   
  var="fisica"   
  for="text"   
  fetchValue="#{pessoaFisicaFace.pessoaFisica.nome}"   
  suggestionAction="#{pessoaFisicaFace.autocomplete}">  
  <h:column>  
    <h:outputText value="#{fisica}"/>  
  </h:column>

  <a4j:actionparam name="idPessoa" value="#{fisica.id}" assignTo="#{pessoaFisicaFace.pessoaFisica.id}"/>

</rich:suggestionbox>
georgesq

em vez de mandar o ID, mande o objeto direto, assim vc num precisa ir novamente pegar um obj q vc esta com ele.

[s]

tati.mat.moreira

Oie,

estou quase conseguindo: <a4j:region immediate="true" renderRegionOnly="true"> <h:inputText id="text" value="#{pessoaFisicaFace.pessoaFisica.nome}" label="Nome " styleClass="rotulos" style=" width : 321px;"/> <rich:suggestionbox ajaxSingle="true" height="150" width="150" for="text" id="sugbox" minChars="1" suggestionAction="#{pessoaFisicaFace.autocomplete}" var="fisica"> <h:column> <h:outputText value="#{fisica}" /> </h:column> <a4j:support event="onselect"> <f:setPropertyActionListener value="1" target="#{pessoaFisicaFace.selectedId}" /> </a4j:support> </rich:suggestionbox> </a4j:region>
Perceba que eu setei o id na mão: <f:setPropertyActionListener value=“1” target="#{pessoaFisicaFace.selectedId}" />

Assim ele sempre trás o mesmo cara. Quando eu troco pra <f:setPropertyActionListener value="#{fisica.id}" target="#{pessoaFisicaFace.selectedId}" /> recebo um erro: <blockquote>Caused by: org.apache.jasper.el.JspPropertyNotFoundException: /pesquisaPessoaFisica.jsp(61,114) ‘#{fisica.id}’ Property ‘id’ not found on type java.lang.String

at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:104)

at org.apache.myfaces.event.SetPropertyActionListener.processAction(SetPropertyActionListener.java:73)

at javax.faces.event.ActionEvent.processListener(ActionEvent.java:51)

at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:554)

… 33 more</blockquote>

O quê está errado?

rsakurai

aparente vc chama a ação pessoaFisicaFace.autocomplete, que retorna uma lista de String e vc guarda essas String na variavel var=“fisica”.
Dessa forma vc usa o outputText com o value #{fisica} para imprimir essa string, e quando vc tenta fazer #{fisica.id} vc ganha o erro.

No seu managedbean define que o método autocomplete retorne uma List

tati.mat.moreira

Troquei, mas recebo um novo erro:

Caused by:
java.lang.NumberFormatException - For input string: "Joao da Silva"

dao
public List<PessoaFisica> pesquisaPessoasFisicasByName(Object nome){
		Criteria c = session.createCriteria(PessoaFisica.class);
		c.add(Restrictions.ilike("nome", nome + "%"));
		c.addOrder(Order.asc("nome"));
		c.setProjection(Projections.property("nome"));
	
		return c.list();
	}
MB
@SuppressWarnings("unchecked")
	public List<PessoaFisica> autocomplete(Object busca){ 
		Session session = HibernateUtil.currentSession();
		PessoaFisicaDao dao = new PessoaFisicaDao(session); 

		return dao.pesquisaPessoasFisicasByName(busca);
	}
jsp
<a4j:region immediate="true" renderRegionOnly="true">
  		<h:inputText id="text" value="#{pessoaFisicaFace.pessoaFisica.nome}" label="Nome " styleClass="rotulos" style=" width : 321px;"/>
 			<rich:suggestionbox ajaxSingle="true" height="150" width="150" for="text" id="sugbox"
                                       minChars="1" 
                                       suggestionAction="#{pessoaFisicaFace.autocomplete}"
                                       var="fisica">
                  <h:column>
                     <h:outputText value="#{fisica}" />
                  </h:column> 
                  <a4j:support event="onselect">
                     <f:setPropertyActionListener value="#{fisica}" target="#{pessoaFisicaFace.pessoaFisica.id}" />
                  </a4j:support>
 			</rich:suggestionbox>
		</a4j:region>
Onde eu tenho que modificar?
rsakurai

acho que seu jsp deveria ficar assim:

<a4j:region immediate="true" renderRegionOnly="true">
    <h:inputText id="text" value="#{pessoaFisicaFace.pessoaFisica.nome}" label="Nome " styleClass="rotulos" style=" width : 321px;"/>
    <rich:suggestionbox ajaxSingle="true" height="150" width="150" for="text" id="sugbox"
                        minChars="1"
                        suggestionAction="#{pessoaFisicaFace.autocomplete}"
                        var="fisica">
      <h:column>
        <h:outputText value="#{fisica.nome}" />
      </h:column>
      <a4j:support event="onselect">
        <f:setPropertyActionListener value="#{fisica.id}" target="#{pessoaFisicaFace.pessoaFisica.id}" />
      </a4j:support>
    </rich:suggestionbox>
  </a4j:region>
tati.mat.moreira

Daí eu recebo o erro:

Caused by:
org.apache.jasper.el.JspPropertyNotFoundException - /pesquisaPessoaFisica.jsp(56,49) ‘#{fisica.nome}’ Property ‘nome’ not found on type java.lang.String
:cry:

rsakurai

Verifica se o seu DAO está retornando o objeto inteiro ou apenas o nome, porque vc deixou a projeção apenas o nome da pessoa:

c.setProjection(Projections.property("nome"));
tati.mat.moreira

Eu preciso adicionar algo mais?

public List<PessoaFisica> pesquisaPessoasFisicasByName(Object nome){
		Criteria c = session.createCriteria(PessoaFisica.class);
		c.add(Restrictions.ilike("nome", nome + "%"));
		c.addOrder(Order.asc("nome"));
		c.setProjection(Projections.property("id"));
		c.setProjection(Projections.property("nome"));
		c.setResultTransformer(Transformers.aliasToBean(PessoaFisica.class));
		
		return c.list();
	}
von.juliano

É só remover as linhas que utilizam Projections, e seus objetos virao completos!

Blz? Flw! :thumbup:

tati.mat.moreira

Agora sim, obrigada Juliano! :*

Os objetos estão vindo completos.

Meu código jsp:
<a4j:region immediate="true" renderRegionOnly="true">
	    <h:inputText id="text" value="#{pessoaFisicaFace.pessoaFisica.nome}" label="Nome " styleClass="rotulos" style=" width : 321px;"/>
	    <rich:suggestionbox ajaxSingle="true" height="150" width="150" for="text" id="sugbox"
	                        minChars="1"
	                        suggestionAction="#{pessoaFisicaFace.autocomplete}"
	                        var="fisica">
	      <h:column>
	        <h:outputText value="#{fisica.nome}" />
	      </h:column>
	      <a4j:support event="onselect">
	        <f:setPropertyActionListener value="#{fisica.id}" target="#{pessoaFisicaFace.pessoaFisica.id}" />
	      </a4j:support>
	    </rich:suggestionbox>
	    </a4j:region>
		
  		<h:commandButton value="Pesquisar" action="#{pessoaFisicaFace.load}" styleClass="botoes"/>
		<h:commandButton value="Voltar" action="goIndex" styleClass="botoes"/>
		<h:commandButton value="Limpar" action="#{pessoaFisicaFace.clean}" styleClass="botoes"/>
Ele lista todas as pessoas no suggestion certinho, mas quando eu seleciono um deles e clico no botão pesquisar recebo o erro:
Caused by: java.lang.IllegalArgumentException: id to load is required for loading at org.hibernate.event.LoadEvent.(LoadEvent.java:74) at org.hibernate.event.LoadEvent.(LoadEvent.java:56) at org.hibernate.impl.SessionImpl.load(SessionImpl.java:819) at org.hibernate.impl.SessionImpl.load(SessionImpl.java:815) at br.com.ez.dao.Dao.load(Dao.java:22) at br.com.ez.faces.PessoaFisicaFace.load(PessoaFisicaFace.java:91) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.el.parser.AstValue.invoke(AstValue.java:172) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68) ... 32 more
maurenginaldo

Qual o seu objetivo ao selecionar a pessoa?
Você quer fazer uma busca no onSelect?

Se for isso faça assim:
//Substitua esse código
 <a4j:support event="onselect">  
         <f:setPropertyActionListener value="#{fisica.id}" target="#{pessoaFisicaFace.pessoaFisica.id}" />  
  </a4j:support>  

//por esse
<a4j:support event="onselect" action="#{pessoaFisicaFace.nome_metodo_pesquisa}" reRender="campos de resultado"/>

No seu método de pesquisa você filtra pelo nome selecionado em #{pessoaFisicaFace.pessoaFisica.nome}

Se seu objetivo for outro posta aí.

Abraços,

tati.mat.moreira
Aeee... resolvi! O problema tava aqui:
<a4j:region immediate="true" renderRegionOnly="true">
	    <h:inputText id="text" value="#{pessoaFisicaFace.pessoaFisica.nome}" label="Nome " styleClass="rotulos" style=" width : 321px;"/>
	    <rich:suggestionbox ajaxSingle="true" height="150" width="150" for="text" id="sugbox"
	                        suggestionAction="#{pessoaFisicaFace.autocomplete}"
	                        var="fisica">
	     <h:column>
	        <h:outputText value="#{fisica.nome}" />
	     </h:column>
	    
	     <a4j:support event="onselect">
	        <f:setPropertyActionListener value="#{fisica.id}" target="#{pessoaFisicaFace.pessoaFisica.id}" />
	     </a4j:support>

A linha

estava incorreta.

O selectedId do meu bean não recebia o valor clicado. Daí troquei por:

e funcionou.

Agradeço a todos que ajudaram! :wink:

Brucelee

Você pode dar uma olhada no meu topico:

http://www.guj.com.br/posts/list/116459.java

Acho parecido com o que você acabou de resolver.

Obrigado.

Criado 27 de janeiro de 2009
Ultima resposta 29 de jan. de 2009
Respostas 14
Participantes 6