Estou com um problema para utilizar o AutoComplete do PrimeFaces… Estou usando Eclipse Juno, PrimeFaces 3.3 e Hibernate 4.1.7.
Estou tentando fazer um AutoComplete de uma lista de bairros.
Primeiro eu populo minha lista de bairros e depois tem o meu método complete que iria verificar a existência do bairro.
Provavelmente um dos meus métodos esta errado, teria como me dar uma ajudinha??
Valeuu
@SuppressWarnings("unchecked")publicvoidpreencheBairros(){this.bairros=newArrayList<Bairro>();Sessionsession=HibernateUtil.getSession();this.bairros=session.createCriteria(Bairro.class).addOrder(Order.asc("nomeBairro")).list();session.close();}publicList<String>complete(Stringbusca){List<String>retorno=newArrayList<String>();for(Bairrobairro:bairros){if(bairros.contains(busca)){retorno.add(bairro);}}returnretorno;}Oerroqueapareceéesse:Nov2,20126:07:25PMcom.sun.faces.lifecycle.ApplyRequestValuesPhaseexecuteWARNING:/cadastroFuncionario.xhtml@51,63completeMethod="#{cadastraFuncionariosBean.complete}":java.lang.NullPointerExceptionjavax.el.ELException:/cadastroFuncionario.xhtml@51,63completeMethod="#{cadastraFuncionariosBean.complete}":java.lang.NullPointerExceptionatcom.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111)atorg.primefaces.component.autocomplete.AutoComplete.broadcast(AutoComplete.java:340)atjavax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)// restante do erro...
Modifiquei meus métodos e criei um conversor. Mas agora esta dando o seguinte erro:
Nov 3, 2012 4:54:11 PM com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback visit
SEVERE: java.lang.ClassCastException: java.lang.String cannot be cast to modelo.Bairro
Meus métodos ficaram assim:
public List<Bairro> complete(String busca) throws Exception {
this.bairros = funcionarioDao.listaTodos();
List<Bairro> complete = new ArrayList<Bairro>();
try {
for (Bairro fore : this.bairros) {
if (fore.getNomeBairro().contains(busca)) {
complete.add(fore);
}
}
} catch (Exception e) {
FacesUtil.adiconarMensagem(FacesMessage.SEVERITY_ERROR, "Erro.",
"Erro na listagem de bairros");
e.printStackTrace();
}
return complete;
}
Conversor
@FacesConverter(value="bairroConverter")publicclassBairroConverterimplementsConverter{@OverridepublicObjectgetAsObject(FacesContextcontext,UIComponentcomponent,Stringvalue){FuncionarioDaofuncionarioDao=newFuncionarioDao();Bairrobairro=null;try{bairro=funcionarioDao.buscaPorNome(value);}catch(Exceptione){FacesUtil.adiconarMensagem(FacesMessage.SEVERITY_FATAL,"Erro grave!!","Erro no conversor de bairros");e.printStackTrace();}returnbairro;}@OverridepublicStringgetAsString(FacesContextcontext,UIComponentcomponent,Objectvalue){Bairrobairro=newBairro();bairro=(Bairro)value;returnbairro.getNomeBairro();}
Não sei onde o que possa ser esse erro…
E
edudebom
Poste aqui o código do xhtml com a chamada do autocomplete.
No teu complete tente colocar isso para ver se altera algo:
Eu alterei tambem o meu conversor, deixei dessa forma:
Bairrobairro=newBairro();try{bairro=(Bairro)value;}catch(Exceptione){FacesUtil.adiconarMensagem(FacesMessage.SEVERITY_FATAL,"Erro.","Erro no conversor.");System.out.println("Erro na conversão");e.printStackTrace();}returnbairro.getNomeBairro();}
O erro:
java.lang.ClassCastException: java.lang.String cannot be cast to modelo.Bairro
at converter.BairroConverter.getAsString(BairroConverter.java:38)
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeSuggestionsAsList(AutoCompleteRenderer.java:434)
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeSuggestions(AutoCompleteRenderer.java:366)
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeResults(AutoCompleteRenderer.java:116)
Erro na conversão
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeEnd(AutoCompleteRenderer.java:98)
Só isso serve?
vou testar isso que voce me falou…
E
edudebom
Mude para
itemValue="#{bairro}"
G
GustavoSS
[quote=edudebom]Mude para
itemValue="#{bairro}"
Era isso mesmo! Agora parou de dar o erro… nem acredito que era só isso… Pura falta de atenção minha.
O problema agora é que ele esta adicionando Null na tabela de bairro. Queria que ele já vinculasse o id do bairro existente… Já não era para fazer isso edudebom??
Valeu pela ajuda!
E
edudebom
Teu converter está fazendo uma busca por nome. Faça ele buscar pela chave primária.
G
GustavoSS
Hebert estou seguindo exemplo que voce citou mais estou me deparando com um erro na seguinte parte do conversor:
@OverridepublicObjectgetAsObject(FacesContextcontext,UIComponentcomponent,Stringvalue){FuncionarioDaofuncionarioDao=newFuncionarioDao();intbairroID;try{bairroID=Integer.parseInt(value);}catch(NumberFormatExceptionexception){thrownewConverterException(newFacesMessage(FacesMessage.SEVERITY_ERROR,"Erro grave","Erro no conversor"));
public Cidade findCidade(Long id) {
EntityManager em = getEntityManager();
try {
return em.find(Cidade.class, id);
} finally {
em.close();
}
}
edudebom,
nesse caso só dá pra fazer com JPA?
Não sei utilizar, estou tentando fazer em Hibernate mas não estou conseguindo tambem… Tem um exemplo que possa me passar?
E
edudebom
Não precisa ser JPA. Você deve ter um BairroDao certo ? Faça uma pesquisa pelo id.
M
MaxSh
edudebom,
fiz um método que pesquise pelo id, o autocomplete até busca os bairros, mas na hora que adiciona acontece a mesma coisa que aconteceu com o GustavoSS ele adiciona o bairro como null ao invés de pegar o id do bairro existente.
Tive um problema parecido ao tentar usar o autoComplete e acabei desistindo dele. Usei o selectOneMenu e acabei tendo praticamente o mesmo resultado.
O autocomplete até encontrava tudo, eu selecionava e no momento de busca-lo no banco ele passava uma variável nula para o meu ManagedBean e não conseguia localizá-lo no banco.
M
MaxSh
Mas ai eu não vou esbarrar no mesmo problema que é o conversor? Por que o selectOneMenu necessita de um conversor também né?
E
edudebom
Tente
itemValue="#{bairro.suachaveprimaria}"
Se não funcionar cole aqui seu Bairro.java
M
MaxSh
Apos alterar o que voce me pediu ocorreu um erro na conversão:
java.lang.ClassCastException: java.lang.Integer cannot be cast to modelo.Bairro
at converter.BairroConverter.getAsString(BairroConverter.java:40)
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeSuggestionsAsList(AutoCompleteRenderer.java:434)
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeSuggestions(AutoCompleteRenderer.java:366)
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeResults(AutoCompleteRenderer.java:116)
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeEnd(AutoCompleteRenderer.java:98)Erro na conversão
Com ficou:
itemValue="#{bairro.idBairro}"
Onde deu o erro:
O value chegou com o valor : 15
publicStringgetAsString(FacesContextcontext,UIComponentcomponent,Objectvalue){if(value==null){return"";}Bairrobairro=newBairro();try{bairro=(Bairro)value;//Erro ocorreu aqui.}catch(Exceptione){FacesUtil.adiconarMensagem(FacesMessage.SEVERITY_FATAL,"Erro.","Erro no conversor.");System.out.println("Erro na conversão");e.printStackTrace();}returnbairro.getNomeBairro();
Classe Bairro:
packagemodelo;//imports@Entity@TablepublicclassBairroimplementsSerializable{@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="IDBairro")privateIntegeridBairro;@Column(name="Bairro",length=40)privateStringnomeBairro;@OneToMany(mappedBy="bairro",cascade=CascadeType.ALL)privateSet<Endereco>enderecos=newHashSet<Endereco>();publicBairro(IntegeridBairro,StringnomeBairro,Set<Endereco>enderecos){super();this.idBairro=idBairro;this.nomeBairro=nomeBairro;this.enderecos=enderecos;}publicBairro(){super();}//Set e Get@OverridepublicStringtoString(){return"Bairro [idBairro="+idBairro+", nomeBairro="+nomeBairro+", enderecos="+enderecos+"]";}}
M
MaxSh
Já não sei mais o que fazer, se tento buscar pelo id da erro de conversão, se tento buscar pelo nome também da erro de conversão!