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)