> For the complete documentation index, see [llms.txt](https://avbravo-2.gitbook.io/trucosjakartaee/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://avbravo-2.gitbook.io/trucosjakartaee/overview/javaee/jpa/pautocomplete-con-converter.md).

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

```java
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**

![](/files/-Lc1X7GliBxfRO_tpW7j)

```java
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**

```java
@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")**

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