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.