¿Cómo funciona EL operador vacío en JSF?

En JSF, se puede representar o no un componente utilizando el operador EL vacío

rendered="#{not empty myBean.myList}" 

Como he entendido, el operador funciona tanto como null-check, pero también comprueba si la lista está vacía.

Quiero hacer comprobaciones vacías en algunos objetos de mi propia clase personalizada, ¿qué interfaz (s) o partes de interfaces necesito implementar? ¿Con qué interfaz es compatible el operador vacío?

De la especificación EL 2.2 (obtenga la siguiente “Haga clic aquí para descargar las especificaciones para la evaluación”):

1.10 Operador empty Aempty A

El operador empty es un operador de prefijo que se puede usar para determinar si un valor es nulo o está vacío.

Para evaluar el empty A

  • Si A es null , devuelve true
  • De lo contrario, si A es la cadena vacía, devuelve true
  • De lo contrario, si A es una matriz vacía, entonces devuelve true
  • De lo contrario, si A es un Map vacío, devuelve true
  • De lo contrario, si A es una Collection vacía, devuelve true
  • De lo contrario devuelve false

Entonces, considerando las interfaces, solo funciona en Collection y Map . En tu caso, creo que Collection es la mejor opción. O, si es un objeto similar a Javabean, entonces Map . De cualquier manera, debajo de las cubiertas, se usa el método isEmpty() para la verificación real. En los métodos de interfaz que no puede o no quiere implementar, puede lanzar UnsupportedOperationException .

Usando la sugerencia de BalusC de implementar Collection ahora puedo ocultar mis primefaces p:dataTable usando el operador no vacío en mi dataModel que extiende javax.faces.model.ListDataModel

Muestra de código:

 import java.io.Serializable; import java.util.Collection; import java.util.List; import javax.faces.model.ListDataModel; import org.primefaces.model.SelectableDataModel; public class EntityDataModel extends ListDataModel implements Collection, SelectableDataModel, Serializable { public EntityDataModel(List data) { super(data); } @Override public Entity getRowData(String rowKey) { // In a real app, a more efficient way like a query by rowKey should be // implemented to deal with huge data List entitys = (List) getWrappedData(); for (Entity entity : entitys) { if (Integer.toString(entity.getId()).equals(rowKey)) return entity; } return null; } @Override public Object getRowKey(Entity entity) { return entity.getId(); } @Override public boolean isEmpty() { List entity = (List) getWrappedData(); return (entity == null) || entity.isEmpty(); } // ... other not implemented methods of Collection... }