JSF имеет встроенный конвертер для enum
, поэтому он должен:
@ManagedBean
@ApplicationScoped
public class Data {
public Status[] getStatuses() {
return Status.values();
}
}
с
<h:selectOneMenu value="#{bean.question.status}" >
<f:selectItems value="#{data.statuses}" />
</h:selectOneMenu>
(примечание: начиная с JSF 2.0 больше нет необходимостидля предоставления SelectItem[]
или List<SelectItem>
, T[]
и List<T>
также принимаются, и вы можете получить доступ к текущему элементу с помощью атрибута var
)
Если вы используетеУтилита JSF OmniFaces , тогда вы можете использовать <o:importConstants>
вместо бина.
<o:importConstants type="com.example.Status" />
<h:selectOneMenu value="#{bean.question.status}" >
<f:selectItems value="#{Status}" />
</h:selectOneMenu>
Если вы также собираетесь управлять метками, вы можетедобавьте их в перечисление 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;
}
}
с помощью
<f:selectItems value="#{data.statuses}" var="status"
itemValue="#{status}" itemLabel="#{status.label}" />
Или, лучше, сделайте значение enum ключом свойства локализованного пакета ресурсов (требуется EL 3.0):
<f:selectItems value="#{data.statuses}" var="status"
itemValue="#{status}" itemLabel="#{text['data.status.' += status]}" />
с этим в файле свойств, связанном с комплектом ресурсов #{text}
data.status.SUBMITTED = Submitted
data.status.REJECTED = Rejected
data.status.APPROVED = Approved