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

发布于 2024-08-26 21:21:27 字数 193 浏览 8 评论 0原文

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

例如,其中 stuff 是一个 enum Stuff

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

Is it possible to test for enum equality in JSF?

E.g. where stuff is an enum Stuff:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

分开我的手 2024-09-02 21:21:27

这实际上与 EL 相关,而不是与 Faces 相关。您发布的构造是有效的,但您应该记住,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 中,您不能像这样直接访问枚举值:

<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />

这只有当您使用 Faces 2.3 引入的 标签:

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

或者,当您尚未使用 Faces 2.3 或不想使用 时,请使用 OmniFaces 前置器 :

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

This is actually more EL related than Faces related. The construct as you posted is valid, but you should keep in mind that enum values are in EL 2.1 or older actually evaluated as String values. If String.valueOf(mrBean.getStuff()) equals String.valueOf(mrsBean.getStuff()), then your code example will render. In EL 2.2 or newer the same construct will work, but they are evaluated as true enums.

Note that it indeed requires a getter method to return the enum value. Given the fact that enums are treated as String, you can in essence also just do:

<h:outputText value="text" rendered="#{mrBean.stuff == 'FOO'}" />

In EL, you cannot access enum values directly like this:

<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />

This is only possible when you use Faces 2.3-introduced <f:importConstants> tag:

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

Or when you're not on Faces 2.3 yet or when you don't want to use <f:metadata>, use the OmniFaces predecesor <o:importConstants>:

<o:importConstants type="com.example.Stuff" />
...
<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />
腻橙味 2024-09-02 21:21:27

如果您有枚举,

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 枚举并失败。

If you have the enum

public enum Status {
    YES, NO
}

you can reference the enums in your jsf pages like so:

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

I'm not so sure about the String evaluation, due to something I stumbled upon while refactoring some code to use enums: if you have a typo in your status String, ie:

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

you will actually get a runtime error when you hit the page because the EL parser will try to coerce 'YESSIR' into a Status enum and fail.

横笛休吹塞上声 2024-09-02 21:21:27

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

枚举定义:

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}"/>

You could define testing methods on the enum, see the following source.

Enum definition:

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

JSF code:

<h:outputText value="text" rendered="#{mrBean.stuff ne null and mrBean.stuff.foo}"/>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文