Come utilizzare i valori enum in f: selectItem (s)

Voglio creare un menu a discesa SelectOneMenu in modo da poter selezionare uno stato nella mia domanda. È ansible rendere la f: selectItem più flessibile considerando cosa succede se l’ordine delle enumerazioni cambia e se la lista è grande? E potrei farlo meglio? Ed è ansible “selezionare” automaticamente l’object che la domanda ha?

Classe Enum

public enum Status { SUBMITTED, REJECTED, APPROVED } 

Entità domanda

 @Enumerated(EnumType.STRING) private Status status; 

JSF

 

JSF ha un convertitore integrato per enum , quindi questo dovrebbe fare:

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

con

    

(nota: dal momento che JSF 2.0 non ha più bisogno di fornire un SelectItem[] o List , anche un T[] e List sono accettati ed è ansible accedere all’attuale elemento tramite l’attributo var )

Se si utilizza la libreria di utilità JSF OmniFaces , è ansible utilizzare invece di un bean.

     

Se hai intenzione di controllare anche le etichette, puoi aggiungerle allo 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; } } 

con

  

Oppure, meglio, rendere il valore enum una chiave di proprietà di un pacchetto di risorse localizzato (richiesto EL 3.0):

  

con questo in un file di proprietà associato al pacchetto di risorse #{text}

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

Per la localizzazione possiamo usare anche questa soluzione:

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

Quindi il percorso della risorsa per le stringhe di localizzazione non è codificato in Enum.

È ansible utilizzare e restituire un elenco di istanze SelectItem che SelectItem l’enum (utilizzare Status.values() per ottenere tutti i valori possibili).

È ansible utilizzare la seguente funzione el utility per ottenere i valori enum e utilizzarli in un SelectOneMenu ad esempio. Non è necessario creare metodi per i fagioli e le piastre.

 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; } } 

Registralo come una funzione el in un file 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 infine chiamalo come:

    

Similiarmente alla risposta di BalusC dovresti usare un bundle di risorse con etichette enum localizzate e per un codice più pulito puoi anche creare una funzione come getEnumLabel(enum)