Autocomplete con Converter
Converter antes de JSF 2.3 no soportan CDI
, por lo que debemos usarlo a través de @Named y @RequestScoped
En el formulario sin jsf 2.3
Usamos <f:converter binding="#{actividadesConverter}" />
<p:outputLabel rendered="#{!actividadesController.nuevoregistro}"
value="#{msg.actividad}" for="actividad" />
<p:autoComplete scrollHeight="250" dropdown="true" size="45"
rendered="#{!actividadesController.nuevoregistro}"
value="#{actividadesController.selected}"
completeMethod="#{actividadesController.actividadesServices.completeActividad}"
var="p"
itemLabel="#{p.actividad}" itemValue="#{p}"
forceSelection="true">
<f:converter binding="#{actividadesConverter}" />
<p:ajax event="itemSelect" listener="#{actividadesController.handleSelect}" update=":form:panel,:form:growl" />
<f:facet name="itemtip">
<h:panelGrid columns="1" cellpadding="5">
<h:outputText value="#{p.actividad}" />
<h:outputText value="#{p.tipo}" />
<h:outputText value="#{p.idactividades}" />
</h:panelGrid>
</f:facet>
</p:autoComplete>
En el converter sin jsf 2.3
Debemos usar las anotaciones @Named
@RequestScoped
import com.javscaz.brigem.Actividades;
import com.javscaz.brigem.ejb.ActividadesFacade;
import com.javscaz.brigem.generales.JSFUtil;
import javax.enterprise.context.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@RequestScoped
public class ActividadesConverter implements Converter {
@Inject
ActividadesFacade actividadesFacade;
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {
System.out.println("");
Actividades actividades = new Actividades();
try {
if (null != s) {
actividades.setIdactividades(Integer.parseInt(s));
actividades = actividadesFacade.findById(actividades.getIdactividades());
}
} catch (Exception e) {
JSFUtil.addErrorMessage("getAsObject()" + e.getLocalizedMessage());
}
return actividades;
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
String r = "";
try {
if (o instanceof Actividades) {
Actividades actividades = (Actividades) o;
r = String.valueOf(actividades.getIdactividades());
} else if (o instanceof String) {
r = (String) o;
}
} catch (Exception e) {
JSFUtil.addErrorMessage("getAsString()" + e.getLocalizedMessage());
}
return r;
}
}
Crear el EJB SessionBean Services
Es idéntico para JSF 2.3 y anteriores, alli colocamos los complete que seran invocados desde los formularios
import com.javscaz.brigem.Actividades;
import com.javscaz.brigem.ejb.ActividadesFacade;
import com.javscaz.brigem.generales.JSFUtil;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.inject.Inject;
/**
*
* @author avbravo
*/
@Stateless
public class ActividadesServices {
@Inject
ActividadesFacade actividadesFacade;
public List<Actividades> completeActividad(String query) {
List<Actividades> actividadesList = new ArrayList<>();
List<Actividades> suggestions = new ArrayList<>();
try {
query = query.trim();
actividadesList = actividadesFacade.findByActividadLike(query.toLowerCase());
actividadesList.stream().forEach((p) -> {
suggestions.add(p);
});
} catch (Exception e) {
JSFUtil.addErrorMessage("completeComercio() " + e.getLocalizedMessage());
}
return suggestions;
}
}
En el Controller
En cada controller donde se usará el autocomplete debemos injectar el Services y generar los métodos set/get
Injectar el services
@Inject
ActividadesServices actividadesServices;
public ActividadesServices getActividadesServices() {
return actividadesServices;
}
public void setActividadesServices(ActividadesServices actividadesServices) {
this.actividadesServices = actividadesServices;
}
JSF 2.3 Soporta CDI en los Converter
Crear al converter con jsf 2.3
Usar @FacesConverter(value = "actividadesConvertidor")
import com.javscaz.brigem.Nivel1;
import com.javscaz.brigem.generales.JSFUtil;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
/**
*
* @author avbravo
*/
@FacesConverter(value = "actividadesConvertidor")
public class ActividadesConvertidor implements Converter {
@Inject
ActividadesFacade actividadesFacade;
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {
Actividades actividades = new Actividades();
try {
if (null != s) {
actividades.setIdactividades(Integer.parseInt(s));
actividades = actividadesFacade.findById(actividades.getIdactividades());
}
} catch (Exception e) {
JSFUtil.addErrorMessage("getAsObject()" + e.getLocalizedMessage());
}
return actividades;
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
String r = "";
try {
if (o instanceof Actividades) {
Actividades actividades = (Actividades) o;
r = String.valueOf(actividades.getIdactividades());
} else if (o instanceof String) {
r = (String) o;
}
} catch (Exception e) {
JSFUtil.addErrorMessage("getAsString()" + e.getLocalizedMessage());
}
return r;
}
}
En el formulario con jsf 2.3
<p:autoComplete scrollHeight="250" dropdown="true" size="45"
rendered="#{!actividadesController.nuevoregistro}"
value="#{actividadesController.selected}"
completeMethod="#{actividadesController.actividadesServices.completeActividad}"
var="p"
itemLabel="#{p.actividad}" itemValue="#{p}"
converter="actividadesConverter" forceSelection="true">
<p:ajax event="itemSelect" listener="#{actividadesController.handleSelect}" update=":form:panel,:form:growl" />
<f:facet name="itemtip">
<h:panelGrid columns="1" cellpadding="5">
<h:outputText value="#{p.actividad}" />
<h:outputText value="#{p.tipo}" />
</h:panelGrid>
</f:facet>
</p:autoComplete>
Comments
*reach your marketing lists or Sales Leads*
Email Appending list is continuously updated with most accurate, quality and verified contacts.
Ehealthcarelists can provide Java Users Email List
complete marketing information such as
· First Name, Last Name
· Business Name
· Practice Specialty, Specialty Code
· Email, Postal Address and Zip Code
· SIC /NAICS Code and NPI Numbers.
· Phone Number and Fax Number
· License Number
· Web address
Thanks for the information and Greetings