如何在 JSF 中测试枚举相等性?

Posted

技术标签:

【中文标题】如何在 JSF 中测试枚举相等性?【英文标题】:How to testing for enum equality in JSF? 【发布时间】:2011-02-01 05:42:30 【问题描述】:

是否可以在 JSF 中测试枚举是否相等?

例如其中stuffenum Stuff

<h:outputText value="text" rendered="#mrBean.stuff == mrsBean.stuff"/>

【问题讨论】:

【参考方案1】:

您可以在枚举上定义测试方法,请参阅以下来源。

枚举定义:

public enum MyEnum 
    FOO;
    public boolean isFoo()
        return FOO.equals(this);
    

JSF 代码:

<h:outputText value="text" rendered="#mrBean.stuff ne null and mrBean.stuff.foo"/>

【讨论】:

【参考方案2】:

这实际上与 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 &lt;o:importConstants&gt;时才有可能:

<o:importConstants type="com.example.Stuff" />
...
<h:outputText value="text" rendered="#mrBean.stuff == Stuff.FOO" />

【讨论】:

我有一个类似的问题,就像你提到的那样:在托管 bean 中我有 Stuff stuff,在我的 JSF 中我尝试 #stuff.FOO,但它不起作用。当你说一个 getter 方法返回枚举值时,你能否更具体地使用你的 FOO、BAR 示例。如果您想更好地了解我的结构,我已经提出了一个单独的问题。 ***.com/questions/3916871/… 什么方法更适合这个?导入 OmniFaces 是否只是因为这个原因导致开销? @Alex:最适合您的应用程序的方式。至于 OmniFaces,它提供的不仅仅是&lt;o:importConstants&gt; @BalusC 谢谢。我选择了 OmniFaces。很高兴它运行得如此完美,而且设置起来非常简单。【参考方案3】:

如果你有枚举

public enum Status 
    YES, NO

您可以像这样在 jsf 页面中引用枚举:

<h:outputText value="text" rendered="#myBean.status == 'YES'"/>

我不太确定字符串评估,因为我在重构一些代码以使用枚举时偶然发现了一些东西:如果你的状态字符串中有错字,即:

<h:outputText value="text" rendered="#myBean.status == 'YESSIR'"/>

当您点击该页面时,您实际上会遇到运行时错误,因为 EL 解析器会尝试将“YESSIR”强制转换为 Status 枚举并失败。

【讨论】:

以上是关于如何在 JSF 中测试枚举相等性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CoreBluetooth 中测试两个 CBPeripheral 的相等性?

如何使用 OffsetDateTime 属性测试数据类的相等性?

如何使用 xcttest 测试对象相等性?

javafx如何测试图像相等性?

重命名后如何检查火花列的相等性

如何将数组列表的相等性与现代 Java 进行比较?