In JSF kann eine Komponente mit dem Operator EL empty gerendert werden oder nicht
rendered="#{not empty myBean.myList}"
Wie ich verstanden habe, arbeitet der Operator sowohl als Null-Check, als auch als Check, um zu prüfen, ob die Liste leer ist.
Ich möchte leere Prüfungen für einige Objekte meiner eigenen benutzerdefinierten Klasse durchführen. Welche Schnittstelle (n) oder Teile von Schnittstellen muss ich implementieren? Mit welcher Schnittstelle ist der leere Operator kompatibel?
Aus EL 2.2-Spezifikation (siehe unten "Klicken Sie hier, um die Spezifikation zur Bewertung herunterzuladen"):
1.10 Leerer Operator -
empty A
Der Operator
empty
ist ein Präfixoperator, mit dem bestimmt werden kann, ob ein Wert null oder leer ist.So bewerten Sie
empty A
- Wenn
A
null
ist,true
zurückgeben- Wenn andernfalls
A
die leere Zeichenfolge ist, wirdtrue
zurückgegeben.- Wenn andernfalls
A
ein leeres Array ist, wirdtrue
zurückgegeben.- Wenn andernfalls
A
ein leererMap
ist, wirdtrue
zurückgegeben.- Wenn andernfalls
A
ein leererCollection
ist, wirdtrue
zurückgegeben.- Ansonsten gib
false
zurück
In Anbetracht der Schnittstellen funktioniert es also nur mit Collection
und Map
. In Ihrem Fall halte ich Collection
für die beste Option. Oder, wenn es sich um ein Javabean-ähnliches Objekt handelt, dann Map
. In beiden Fällen wird unter dem Deckmantel die Methode isEmpty()
für die eigentliche Prüfung verwendet. Auf Interface-Methoden, die Sie nicht implementieren können oder wollen, könnten Sie UnsupportedOperationException
werfen.
Mit dem Vorschlag von BalusC, Collection zu implementieren, kann ich jetzt meine Primefaces p:dataTable
Mit dem Operator not empty auf meinem dataModel
verbergen, der javax.faces.model.ListDataModel
Erweitert.
Codebeispiel:
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<Entity> implements
Collection<Entity>, SelectableDataModel<Entity>, Serializable {
public EntityDataModel(List<Entity> 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<Entity> entitys = (List<Entity>) 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> entity = (List<Entity>) getWrappedData();
return (entity == null) || entity.isEmpty();
}
// ... other not implemented methods of Collection...
}