Como usar valores enum em f: selectItem (s)

Eu quero fazer um dropdown selectOneMenu para que eu possa selecionar um status na minha pergunta. É possível tornar o f: selectItem mais flexível, considerando o que acontece se a ordem das enums for alterada e se a lista for grande? E eu poderia fazer isso melhor? E é possível “selecionar” automaticamente o item que a pergunta tem?

Classe Enum

public enum Status { SUBMITTED, REJECTED, APPROVED } 

Entidade de pergunta

 @Enumerated(EnumType.STRING) private Status status; 

JSF

 

    JSF tem um conversor embutido para enum , então isso deve fazer:

     @ManagedBean @ApplicationScoped public class Data { public Status[] getStatuses() { return Status.values(); } } 

    com

        

    (Nota: já que o JSF 2.0 não precisa mais fornecer um SelectItem[] ou List , um T[] e um List são aceitos e você pode acessar o item atual pelo atributo var )

    Se você usar a biblioteca de utilitários JSF OmniFaces , poderá usar vez de um bean.

         

    Se você pretende controlar os labels também, você pode adicioná-los ao Status Enum:

     public enum Status { SUBMITTED("Submitted"), REJECTED("Rejected"), APPROVED("Approved"); private String label; private Status(String label) { this.label = label; } public String getLabel() { return label; } } 

    com

      

    Ou melhor, faça com que a enum valorize uma chave de propriedade de um pacote de resources localizado (exigido pelo EL 3.0):

      

    com isso em um arquivo de propriedades associado ao pacote de resources #{text}

     data.status.SUBMITTED = Submitted data.status.REJECTED = Rejected data.status.APPROVED = Approved 

    Para localização, podemos usar também esta solução:

     public enum Status { SUBMITTED, REJECTED, APPROVED } data.status.SUBMITTED=Submitted data.status.REJECTED=Rejected data.status.APPROVED=Approved    

    Portanto, o caminho do recurso para cadeias de localização não é codificado no Enum.

    Você poderia usar e retornar uma lista de instâncias SelectItem que envolvem o enum (use Status.values() para obter todos os valores possíveis).

    Você pode usar a seguinte function de utilitário el para obter os valores enum e usá-los em um SelectOneMenu por exemplo. Não há necessidade de criar methods beans e boilerplate.

     public final class ElEnumUtils { private ElEnumUtils() { } /** * Cached Enumerations, key equals full class name of an enum */ private final static Map[]> ENTITY_ENUMS = new HashMap<>();; /** * Retrieves all Enumerations of the given Enumeration defined by the * given class name. * * @param enumClassName Class name of the given Enum. * * @return * * @throws ClassNotFoundException */ @SuppressWarnings("unchecked") public static Enum< ?>[] getEnumValues(final String enumClassName) throws ClassNotFoundException { // check if already cached - use classname as key for performance reason if (ElEnumUtils.ENTITY_ENUMS.containsKey(enumClassName)) return ElEnumUtils.ENTITY_ENUMS.get(enumClassName); final Class> enumClass = (Class>) Class.forName(enumClassName); final Enum< ?>[] enumConstants = enumClass.getEnumConstants(); // add to cache ElEnumUtils.ENTITY_ENUMS.put(enumClassName, enumConstants); return enumConstants; } } 

    Registre-o como uma function el em um arquivo taglib:

      Retrieves all Enumerations of the given Enumeration defined by the given class name. getEnumValues  package.ElEnumUtils   java.lang.Enum[] getEnumValues(java.lang.String)   

    E finalmente chamamos assim:

        

    Semelhante à resposta do BalusC, você deve usar um pacote de resources com labels enum localizados e, para um código mais limpo, também é possível criar uma function como getEnumLabel(enum)