<p:autocomplete> con Converter

<p: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

            <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>

Last updated