Saltar al contenido

Valor de configuración de error de conversión para ‘null Converter ‘- ¿Por qué necesito un convertidor en JSF?

Hola usuario de nuestra web, encontramos la solución a lo que buscas, deslízate y la encontrarás aquí.

Solución:

Introducción

JSF genera HTML. HTML es en términos de Java básicamente una gran String. Para representar objetos Java en HTML, deben convertirse a String. Además, cuando se envía un formulario HTML, los valores enviados se tratan como String en los parámetros de solicitud HTTP. Bajo las sábanas, JSF los extrae del HttpServletRequest#getParameter() que regresa String.

Para convertir entre un objeto Java no estándar (es decir, no un String, Number o Boolean para el cual EL tiene conversiones integradas, o Date para lo cual JSF proporciona incorporado etiqueta), debe proporcionar una etiqueta personalizada Converter. los SelectItem no tiene ningún propósito especial. Es solo un sobrante de JSF 1.x cuando no era posible suministrar, por ejemplo, List directamente a . Tampoco tiene un tratamiento especial en cuanto a etiquetas y conversión.

getAsString ()

Necesitas implementar getAsString() método de tal manera que el objeto Java deseado se representa en un únicoString representación que se puede utilizar como parámetro de solicitud HTTP. Normalmente, la identificación técnica (la base de datos primaria key) se utiliza aquí.

public String getAsString(FacesContext context, UIComponent component, Object modelValue) 
    if (modelValue == null) 
        return ""; // Never return null here!
    

    if (modelValue instanceof Warehouse) 
        return String.valueOf(((Warehouse) modelValue).getId());
     else 
        throw new ConverterException(new FacesMessage(modelValue + " is not a valid Warehouse"));
    

Tenga en cuenta que devolver un vacío string en caso de un null/ valor de modelo vacío es significativo y requerido por el javadoc:

Devuelve: una cadena de longitud cero si el valor es null, de lo contrario, el resultado de la conversión

De lo contrario, el generado no tendrá un value attribute y, de forma predeterminada, envíe la etiqueta del artículo a getAsObject(). Consulte también Uso de “Seleccione” f: selectItem con null/ valor vacío dentro de ap: selectOneMenu.

getAsObject ()

Necesitas implementar getAsObject() de tal manera que exactamente ese String representación devuelta por getAsString() se puede convertir de nuevo a exactamente el mismo objeto Java especificado como modelValue en getAsString().

public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) 

En otras palabras, debe ser técnicamente capaz de devolver el objeto devuelto como modelValue argumento de getAsString() y luego devolver el obtenido string como submittedValue argumento de getAsObject() en un bucle infinito.

Uso

Finalmente, anote el Converter con @FacesConverter para enganchar el tipo de objeto en cuestión, JSF se encargará automáticamente de la conversión cuando Warehouse el tipo alguna vez entra en escena:

@FacesConverter(forClass=Warehouse.class)

Ese fue el enfoque JSF “canónico”. Después de todo, no es muy efectivo, ya que de hecho también podría haber tomado el artículo del . Pero el punto más importante de un Converter es que devuelve un únicoString representación, de modo que el objeto Java pueda identificarse mediante una simple String adecuado para pasar en HTTP y HTML.

Convertidor genérico basado en toString ()

La biblioteca de utilidades JSF OmniFaces tiene un SelectItemsConverter que funciona en base a toString() resultado de la entidad. De esta manera no es necesario jugar con getAsObject() y costosas operaciones comerciales / de bases de datos. Para ver algunos ejemplos de uso concreto, consulte también el escaparate.

Para usarlo, simplemente regístrelo de la siguiente manera:


Y asegúrate de que el toString() de tu Warehouse entidad devuelve un único representación de la entidad. Por ejemplo, podría devolver directamente la identificación:

@Override
public String toString() 
    return String.valueOf(id);

O algo más legible / reutilizable:

@Override
public String toString() 
    return "Warehouse[id=" + id + "]";

Ver también:

  • ¿Cómo completar las opciones de h: selectOneMenu de la base de datos?
  • Convertidor de entidad JSF genérico, para que no necesite escribir un convertidor para cada entidad.
  • Uso de enumeraciones en JSF selectitems: las enumeraciones deben tratarse de manera un poco diferente
  • ¿Cómo inyectar @EJB, @PersistenceContext, @Inject, @Autowired, etc.en @FacesConverter?

No relacionado al problema, dado que JSF 2.0 ya no se requiere explícitamente tener un List como valor. Solo un List también sería suficiente.


    
    

private Warehouse selectedWarehouse;
private List availableWarehouses;

Ejemplo de convertidor genérico JSF con ABaseEntity e identificador:

ABaseEntity.java

public abstract class ABaseEntity implements Serializable 

    private static final long serialVersionUID = 1L;

    public abstract Long getIdentifier();

SelectItemToEntityConverter.java

@FacesConverter(value = "SelectItemToEntityConverter")
public class SelectItemToEntityConverter implements Converter 

    @Override
    public Object getAsObject(FacesContext ctx, UIComponent comp, String value) 
        Object o = null;
        if (!(value == null 

    @Override
    public String getAsString(FacesContext ctx, UIComponent comp, Object value) 
        String s = "";
        if (value != null) 
            s = ((ABaseEntity) value).getIdentifier().toString();
        
        return s;
    

    private ABaseEntity getSelectedItemAsEntity(UIComponent comp, String value) 
        ABaseEntity item = null;

        List selectItems = null;
        for (UIComponent uic : comp.getChildren()) 
            if (uic instanceof UISelectItems) 
                Long itemId = Long.valueOf(value);
                selectItems = (List) ((UISelectItems) uic).getValue();

                if (itemId != null && selectItems != null && !selectItems.isEmpty()) 
                    Predicate predicate = i -> i.getIdentifier().equals(itemId);
                    item = selectItems.stream().filter(predicate).findFirst().orElse(null);
                
            
        

        return item;
    

Y uso:


    
    

Reseñas y valoraciones del artículo

Eres capaz de añadir valor a nuestro contenido contribuyendo tu veteranía en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *