Auto complete primefaces ´[Resolvido]

e ai galera… seguinte fiz um aturo complete mas ele ta me retornando um objeto e não a string com o campo chamado nome alguem pode me ajuda? sera que tem q comverter para string?

´[code]

<p:autoComplete id=“acForce” forceSelection=“true”
value="#{categoriaBean.categoria.nomeCategoria}"
completeMethod="#{categoriaBean.complete}"
var=“categoria” itemLabel="#{categoria.nomeCategoria}" itemValue="#{categoria}" />

´[/code]

´[code]

public List complete (String prefix){
List todas = new ArrayList();
//Categoria cat = new Categoria();
todas = hibernateDao.complete(“SELECT * FROM categoria where nomeCategoria like '%”+prefix+"%’ ORDER BY nomeCategoria LIMIT 5");
return todas;
}

´[/code]

Fera, olhando rápido me parece que o problema está na linha 02 do componente autoComplete, pois o value deveria ser “#{categoriaBean.categoria}”. O que você quer que apareça na tela (o nome) já está definido no atributo itemLabel. Em outras palavras, o seu autoComplete enxerga uma lista de Categoria e seleciona um objeto Categoria, por isso, deve guardar (atributo ‘value’) em um atributo do tipo Categoria no seu ManagedBean.

Forte abraço!

Outra observação que penso ser pertinente é que o seu método hibernateDao.complete() deve sempre retornar um List, mesmo que seja uma lista vazia. Sendo assim, não é necessário instanciar um ArrayList como é feito na linha 01, pois esse ArrayList não será usado para nada e só será uma coisa a mais para o garbage collector mandar para o espaço.

Em resumo, certifique-se de que o método hibernateDao.complete() retorna sempre uma lista (mesmo que vazia). Se sim, atribui null na variável ‘todas’ da linha 01, ou declara a variável direto na atribuição quente da linha 04.

Depois diz aí se funcionou.

Abraço!

carra mto obrigado pela ajuda… fiz o que voce pedio mas agora ele não mostra nada e me da este erro

GRAVE: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.lang.String

Seu código ficou

<p:autoComplete id="acForce" forceSelection="true"     
             value="#{categoriaBean.categoria}"  // Com a correção sugerida     
             completeMethod="#{categoriaBean.complete}"  
             var="categoria" itemLabel="#{categoria.nomeCategoria}" itemValue="#{categoria}" />    

e mudou para este erro?

Bom, o atributo categoriaBean.categoria é do tipo Categoria?

E dá uma olhada geral no teu xhtml e vê se não tá faltando algum fecha-parêntesis ou fecha-aspas ou fecha-chaves ou se não tem coisa grudada (sem espaço separando) pois as vezes esses detalhes dão uns erros nada-a-ver assim no console. :wink:

sim o categoria é do tipo categoria

verifiquei e esta tudo certo meu codigo…

vou postar minha classe categoria qm sabe ajuda em alguma coisa.

package br.com.vendas.beans;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;

@Entity
public class Categoria implements Serializable{

	private static final long serialVersionUID = 1L;
	@GeneratedValue
	@Id
	private Integer idCategoria;
	private String nomeCategoria;
	public Integer getIdCategoria() {
		return idCategoria;
	}
	public void setIdCategoria(Integer idCategoria) {
		this.idCategoria = idCategoria;
	}
	public String getNomeCategoria() {
		return nomeCategoria;
	}
	public void setNomeCategoria(String nomeCategoria) {
		this.nomeCategoria = nomeCategoria;
	}
	
	
	
}

Cara, resolvi dar uma olhada com calma em um código que fiz e acho que matei a charada.

Você precisa de um converter!

Adicione como atributo do teu autoComplete o seguinte:

converter=“categoriaConverter”

E aí crie um converter:

package seupacote; //arrume isso :)

import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter(value = "categoriaConverter")
public class CategoriaConverter implements Converter {
    
    public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
        if (value != null) {
            return this.getAttributesFrom(component).get(value);
        }
        return null;
    }

    public String getAsString(FacesContext ctx, UIComponent component, Object value) {

        if (value != null
                && !"".equals(value)) {

           // adiciona item como atributo do componente  
            this.addAttribute(component, value);

            Long id = ((Categoria) value).getIdCategoria();
            if (codigo != null) {
                return String.valueOf(codigo);
            }
        }

        return (String) value;
    }

    protected void addAttribute(UIComponent component, Object value) {
        Long id = ((Categoria) value).getIdCategoria();
        if(id!=null){
            String key = id.toString(); 
            this.getAttributesFrom(component).put(key, value);
        }
    }

    protected Map<String, Object> getAttributesFrom(UIComponent component) {
        return component.getAttributes();
    }
}

Dependendo da versão do Java EE que você usa, vai precisar declarar esse converter no faces-config.xml. Se for o EE 6 não precisa.

Editei direto aqui no tópico, pode dar algum errinho besta como uma falta de ponto-e-vírgula ou algo do tipo. Mas a ideia é essa!

Testa ae!


	<p:autoComplete id="acForce" forceSelection="true"
					value="#{categoriaBean.categoria}" converter="categoriaConverter"
					completeMethod="#{categoriaBean.complete}" var="categoria"
					itemLabel="#{categoria.nomeCategoria}" itemValue="#{categoria}" />

package br.com.vendas.controller;
  
import java.util.Map;  
import javax.faces.component.UIComponent;  
import javax.faces.context.FacesContext;  
import javax.faces.convert.Converter;  
import javax.faces.convert.FacesConverter;  

import br.com.vendas.beans.Categoria;
  
@FacesConverter(value = "categoriaConverter")  
public class CategoriaConverter implements Converter {  
      
    public Object getAsObject(FacesContext ctx, UIComponent component, String value) {  
        if (value != null) {  
            return this.getAttributesFrom(component).get(value);  
        }  
        return null;  
    }  
  
    public String getAsString(FacesContext ctx, UIComponent component, Object value) {  
  
        if (value != null  
                && !"".equals(value)) {  
  
           // adiciona item como atributo do componente    
            this.addAttribute(component, value);  
  
            Integer id = ((Categoria)value).getIdCategoria();  
            if (id != null) {  
                return String.valueOf(id);  
            }  
        }  
  
        return (String) value;  
    }  
  
    protected void addAttribute(UIComponent component, Object value) {  
        Integer id = ((Categoria) value).getIdCategoria();  
        if(id!=null){  
            String key = id.toString();   
            this.getAttributesFrom(component).put(key, value);  
        }  
    }  
  
    protected Map<String, Object> getAttributesFrom(UIComponent component) {  
        return component.getAttributes();  
    }  
}  

o erro [e outro agora

05/05/2012 00:50:23 com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
GRAVE: Error Rendering View[/teste.xhtml]
java.lang.ClassCastException: br.com.vendas.beans.Categoria cannot be cast to java.lang.String
	at br.com.vendas.controller.CategoriaConverter.getAsString(CategoriaConverter.java:35)
	at org.primefaces.util.ComponentUtils.getValueToRender(ComponentUtils.java:74)
	at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeHiddenInput(AutoCompleteRenderer.java:196)
	at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeSingleMarkup(AutoCompleteRenderer.java:144)
	at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeMarkup(AutoCompleteRenderer.java:123)
	at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeEnd(AutoCompleteRenderer.java:101)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:61)
	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:45)
	at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:185)
	at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:108)
	at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:55)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:301)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:162)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:140)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
05/05/2012 00:50:23 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/Vendas] threw exception [br.com.vendas.beans.Categoria cannot be cast to java.lang.String] with root cause
java.lang.ClassCastException: br.com.vendas.beans.Categoria cannot be cast to java.lang.String
	at br.com.vendas.controller.CategoriaConverter.getAsString(CategoriaConverter.java:35)
	at org.primefaces.util.ComponentUtils.getValueToRender(ComponentUtils.java:74)
	at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeHiddenInput(AutoCompleteRenderer.java:196)
	at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeSingleMarkup(AutoCompleteRenderer.java:144)
	at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeMarkup(AutoCompleteRenderer.java:123)
	at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeEnd(AutoCompleteRenderer.java:101)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:61)
	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:45)
	at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:185)
	at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:108)
	at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:55)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:301)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:162)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:140)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

deu certo até que enfim obrigado…