Olá pessoal, estou tendo um probleminha chato aqui, já postei vários foruns, mas não consigo obter sucesso.
Bem, a idéia é que quando puder clicar sobre um valor sugerido em um autocomplete, possa obtê-lo e setar uma variável.
Esta será necessária para construir uma lista. O problema é que não consigo obter o valor ao clicar sobre ele.
Obrigado, desde já.
Página:
<div id="campos">
<p:autoComplete id="complete" value="#{empresaBean.empresa.nome}"
var="empresa" completeMethod="#{empresaBean.autocompleteEmpresa}"
itemLabel="#{empresa.nome}" itemValue="#{empresa.nome}"
converter="Converter"
onkeyup="this.value = this.value.toUpperCase();" maxResults="5"
size="82">
<p:ajax event="itemSelect" update="complete" />
</p:autoComplete>
</div>
<div id="botaopesq">
<p:commandLink actionListener="#{empresaBean.buscarPorNome}"
title="Pesquisar" value="#{empresa.nome}" action="pesquisa">
<h:graphicImage library="images" name="botao.png" width="118"
height="27" style="border:0" />
<f:setPropertyActionListener target="#{empresaBean.empresa}"
value="#{empresa}" />
</p:commandLink>
Método usado para autocompletar:
public List<Empresa> autocompleteEmpresa(String query) {
List<Empresa> results = new ArrayList<Empresa>();
if (empresas.isEmpty()) {
this.empresas = empresaRN.complete();
}
for (Empresa e : empresas) {
if (e.getNome().startsWith(query)) {
results.add(e);
}
}
return results;
}
Converter usado:
package com.portal.view;
import java.lang.reflect.Field;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.persistence.Id;
@FacesConverter(value = "Converter")
public class EntityConverter implements Converter {
public Object getAsObject(FacesContext ctx, UIComponent component,
String value) {
System.out.println("ECV-GO");
return value;
}
public String getAsString(FacesContext ctx, UIComponent component,
Object obj) {
System.out.println("ECV-GS");
if (obj != null && !"".equals(obj)) {
String id;
try {
id = this.getId(getClazz(ctx, component), obj);
if (id == null) {
id = "";
}
id = id.trim();
component.getAttributes().put(id,
getClazz(ctx, component).cast(obj));
return id;
} catch (SecurityException e) {
e.printStackTrace(); // seu log aqui
} catch (IllegalArgumentException e) {
e.printStackTrace(); // seu log aqui
} catch (NoSuchFieldException e) {
e.printStackTrace(); // seu log aqui
} catch (IllegalAccessException e) {
e.printStackTrace(); // seu log aqui
}
}
return null;
}
private Class<?> getClazz(FacesContext facesContext, UIComponent component) {
return component.getValueExpression("value").getType(
facesContext.getELContext());
}
public String getId(Class<?> clazz, Object obj) throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
IllegalAccessException {
for (Field field : clazz.getDeclaredFields()) {
if ((field.getAnnotation(Id.class)) != null) {
Field privateField = clazz.getDeclaredField(field.getName());
privateField.setAccessible(true);
if (privateField.get(clazz.cast(obj)) != null) {
return (String) field.getType()
.cast(privateField.get(clazz.cast(obj))).toString();
} else {
return null;
}
}
}
return null;
}
}
Método no DAO usado para o autocomplete:
@SuppressWarnings("unchecked")
public List<Empresa> complete() {
Query query = this.session.createQuery("Select e From Empresa as e");
return query.list();
}