Valor de configuración de error de conversión para 'convertidor nulo': ¿por qué necesito un convertidor en JSF?
Tengo problemas para entender cómo usar la selección en JSF 2 con POJO / entidad de manera efectiva. Por ejemplo, estoy tratando de seleccionar unWarehouse
entidad a través del siguiente menú desplegable:
<h:selectOneMenu value="#{bean.selectedWarehouse}">
<f:selectItem itemLabel="Choose one .." itemValue="#{null}" />
<f:selectItems value="#{bean.availableWarehouses}" />
</h:selectOneMenu>
Y el siguiente bean gestionado:
@Named
@ViewScoped
public class Bean {
private Warehouse selectedWarehouse;
private List<SelectItem> availableWarehouses;
// ...
@PostConstruct
public void init() {
// ...
availableWarehouses = new ArrayList<>();
for (Warehouse warehouse : warehouseService.listAll()) {
availableWarehouses.add(new SelectItem(warehouse, warehouse.getName()));
}
}
// ...
}
Tenga en cuenta que uso todoWarehouse
entidad como el valor deSelectItem
.
Cuando envío el formulario, esto falla con el siguiente mensaje de caras:
Error de conversión al establecer el valor 'com.example.Warehouse@cafebabe' para 'Convertidor nulo'.
Esperaba que JSF pudiera establecer la correctaWarehouse
objetar a mi bean administrado cuando lo envuelvo en unSelectItem
. Envolviendo mi entidad dentro delSelectItem
estaba destinado a omitir la creación de unConverter
para mi entidad
¿Realmente tengo que usar unConverter
cada vez que quiero hacer uso de entidades en mi<h:selectOneMenu>
? Para JSF debería ser posible simplemente extraer el elemento seleccionado de la lista de elementos disponibles. Si realmente tengo que usar un convertidor, ¿cuál es la forma práctica de hacerlo? Hasta ahora llegué a esto:
Converter
implementación para la entidad.Anulando elgetAsString()
. Creo que no necesito esto ya que la propiedad de etiqueta delSelectItem
se usará para mostrar la etiqueta de la opción desplegable.Anulando elgetAsObject()
. Creo que esto se usará para devolver el correctoSelectItem
o entidad dependiendo del tipo del campo seleccionado definido en el bean administrado.losgetAsObject()
me confunde. ¿Cuál es la forma eficiente de hacer esto? Teniendo el valor de cadena, ¿cómo obtengo el objeto de entidad asociado? ¿Debo consultar el objeto de entidad desde el objeto de servicio basado en el valor de cadena y devolver la entidad? ¿O tal vez de alguna manera puedo acceder a la lista de las entidades que forman los elementos de selección, hacer un bucle para encontrar la entidad correcta y devolver la entidad?
¿Cuál es el enfoque normal de esto?