Действительно ли возможно протестировать на перечислимое равенство в JSF?
Например, где stuff
enum Stuff
:
<h:outputText value="text" rendered="#{mrBean.stuff == mrsBean.stuff}"/>
На самом деле это больше связано с EL, чем с JSF. Конструкция в том виде, в котором вы написали, является правильной, но вы должны помнить, что значения перечислений в EL 2.1 фактически оцениваются как значения String
. Если String.valueOf(mrBean.getStuff())
равно String.valueOf(mrsBean.getStuff())
, то ваш пример кода будет отображаться. В EL 2.2 будет работать та же конструкция, но они будут оцениваться как истинные перечисления.
Обратите внимание, что для возврата значения перечисления действительно требуется метод getter. Учитывая тот факт, что перечисления рассматриваются как String
, по сути, вы также можете просто сделать:
<h:outputText value="text" rendered="#{mrBean.stuff == 'FOO'}" />
В текущей версии EL 2. 2, вы не можете получить прямой доступ к значениям перечислений вот так:
<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />
Это возможно только при использовании OmniFaces
:
<o:importConstants type="com.example.Stuff" />
...
<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />
Если у вас есть enum
public enum Status {
YES, NO
}
, вы можете ссылаться на перечисления на своих страницах jsf следующим образом:
<h:outputText value="text" rendered="#{myBean.status == 'YES'}"/>
Я не уверен в оценке String из-за того, что я наткнулся при рефакторинге кода для использования перечислений : если у вас есть опечатка в строке состояния, например:
<h:outputText value="text" rendered="#{myBean.status == 'YESSIR'}"/>
, вы фактически получите ошибку времени выполнения, когда попадете на страницу, потому что синтаксический анализатор EL попытается преобразовать 'YESSIR' в перечисление Status
и неудача.