Como funciona o operador EL empty no JSF?

88

No JSF, um componente pode ser renderizado ou não usando o operador EL empty

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

Pelo que entendi, o operador funciona tanto como verificação de nulos, mas também verifica se a lista está vazia.

Eu quero fazer verificações vazias em alguns objetos de minha própria classe personalizada, que interface (s) ou partes de interfaces preciso implementar? Com qual interface o operador vazio é compatível?

Aksel Willgert
fonte

Respostas:

151

Da especificação EL 2.2 (obtenha abaixo "Clique aqui para baixar a especificação para avaliação"):

1.10 Operador vazio - empty A

O emptyoperador é um operador de prefixo que pode ser usado para determinar se um valor é nulo ou vazio.

Avaliar empty A

  • Se Afor null, voltetrue
  • Caso contrário, se Afor a string vazia, então retornetrue
  • Caso contrário, se Afor uma matriz vazia, então retornetrue
  • Caso contrário, se Afor um vazio Map, retornetrue
  • Caso contrário, se Afor um vazio Collection, retornetrue
  • Caso contrário, volte false

Portanto, considerando as interfaces, funciona em Collectione Mapapenas. No seu caso, acho que Collectioné a melhor opção. Ou, se for um objeto semelhante ao Javabean, então Map. De qualquer forma, nos bastidores, o isEmpty()método é usado para a verificação real. Em métodos de interface que você não pode ou não deseja implementar, você pode lançar UnsupportedOperationException.

BalusC
fonte
Estranho, tento usar isso em um Long and eclipse (4.4.0) dicas de que "Esta expressão vazia sempre avalia como falsa. Apenas strings, mapas, matrizes e coleção têm valores significativos para o operador vazio"
Pieter De Bie
Ainda mais estranho, sempre avalia como verdadeiro no meu caso.
Pieter De Bie
E se myBeanfor null? Será true/ falseainda será retornado ou pode lançar uma exceção?
theyuv
9

Usando a sugestão de BalusC de implementar a coleção, agora posso ocultar minhas faces primárias p:dataTableusando o operador not empty no meu dataModelque estendejavax.faces.model.ListDataModel

Amostra 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<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...
}
Aksel Willgert
fonte