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

![](https://2578941663-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6ze2c8GK7mFBZX%2F-Lc1WjGeqF4Ig-44ZLgX%2F-Lc1X7GliBxfRO_tpW7j%2Fre.png?generation=1554820663433745\&alt=media)

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://avbravo-2.gitbook.io/trucosjakartaee/overview/javaee/jpa/pautocomplete-con-converter.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
