Cómo usar los valores enum en f: selectItem (s)

Quiero hacer un menú desplegable selectOneMenu para poder seleccionar un estado en mi pregunta. ¿Es posible hacer que f: selectItem sea más flexible teniendo en cuenta lo que sucede si el orden de las enumeraciones cambia, y si la lista era grande? ¿Y podría hacerlo mejor? ¿Y es posible “seleccionar” automáticamente el elemento que tiene la pregunta?

Clase Enum

public enum Status { SUBMITTED, REJECTED, APPROVED } 

Entidad de pregunta

 @Enumerated(EnumType.STRING) private Status status; 

JSF

 

JSF tiene un convertidor incorporado para enum , así que esto debería hacer:

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

con

    

(nota: desde JSF 2.0 ya no hay necesidad de proporcionar un SelectItem[] o List , también se List T[] y List y se puede acceder al elemento actual mediante el atributo var )

Si usa la biblioteca de utilidades JSF OmniFaces , puede usar lugar de un bean.

     

Si tiene la intención de controlar las tags también, puede agregarlas a la enumeración de Status :

 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

  

O mejor, haga que el valor enum sea una clave de propiedad de un paquete de recursos localizado (se requiere EL 3.0):

  

con esto en un archivo de propiedades asociado con el paquete de recursos #{text}

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

Para la localización también podemos usar esta solución:

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

Por lo tanto, la ruta del recurso para las cadenas de localización no está codificada en Enum.

Puede usar y devolver una lista de instancias de SelectItem que envuelven la enumeración (use Status.values() para obtener todos los valores posibles).

Puede usar la siguiente función de utilidad para obtener los valores enum y usarlos en SelectOneMenu por ejemplo. No es necesario crear frijoles y métodos repetitivos.

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

Regístrelo como una función el en un archivo taglib:

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

Y finalmente llámalo así:

    

De forma similar a la respuesta de BalusC, debe utilizar un paquete de recursos con tags enum localizadas y, para obtener un código más limpio, también puede crear una función como getEnumLabel(enum)