包含在枚举列表中的返回错误结果

时间:2017-10-25 20:06:47

标签: jsf el

我尝试使用

有条件地渲染一个primefaces字段集
<p:fieldset legend="content" rendered="#{controller.object.list.contains('THREAD_PROTRUSION')}" >

其中&#39; THREAD_PROTRUSION&#39;是一个枚举。当我觉得应该将字段集渲染时,我将这些输出添加到我的页面中:

#{controller.object.list}<br/>
#{controller.object.list.contains('THREAD_PROTRUSION')}<br/>

,显示以下内容

[THREAD_PROTRUSION, ENGAGE_NUT]
false

为什么值为false时为&#39; THREAD_PROTRUSION&#39;在列表中?

还有一点这个。该列表是从另一个屏幕上的复选框设置的,并通过加载JSON输入文件来填充。如果我带着复选框返回到视图并循环它们(取消选中,然后重新检查),然后返回到我的fieldset的视图,我看到了

[THREAD_PROTRUSION, ENGAGE_NUT]
true

当然现在渲染了字段集

== MCV示例

view.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:o="http://omnifaces.org/ui" xmlns:p="http://primefaces.org/ui" xmlns:bjap="http://bjap.gdeb.com/facelets">

<h:body>
                    <li><b>Enum List </b> #{bean.myList}</li>
                    <li><b>bean.myList[0] </b>#{bean.myList[0]}</li>
                    <li><b>bean.myList[1] </b>#{bean.myList[1]}</li>
                    <li><b>bean.myList.contains('RED') </b>#{bean.myList.contains('RED')}</li>
                    <li><b>bean.myList[0] eq 'RED' </b>#{bean.myList[0] eq 'RED'}</li>
                    <li><b>bean.myList[1] eq 'RED' </b>#{bean.myList[1] eq 'RED'}</li>
</h:body>
</html>

Bean.java

@Named
public class Bean implements Serializable {
    private static final long serialVersionUID = 1L;

    public enum Color {
        WHITE, BLACK, RED, YELLOW, BLUE
    }

    private List<Color> myList;

    public Bean() {
        myList = new ArrayList<>();
        myList.add(Color.WHITE);
        myList.add(Color.RED);
    }

    public List<Color> getMyList() {
        return myList;
    }

    public void setMyList(List<Color> myList) {
        this.myList = myList;
    }

}

输出

Enum List  [WHITE, RED]
bean.myList[0] WHITE
bean.myList[1] RED
bean.myList.contains('RED') false <-Expected to be true???
bean.myList[0] eq 'RED' false
bean.myList[1] eq 'RED' true

1 个答案:

答案 0 :(得分:0)

基于这个答案EL syntax to check if a set contains a specific Enum value我现在明白为什么在我预期它是真的时这是错误的。

#{controller.object.list.contains('THREAD_PROTRUSION')}

正如我在上面的问题中所提到的,该列表最初是通过加载JSON(fasterxml Jackson)来填充的。该列表支持一组Primefaces复选框。

我发现杰克逊将复选框值加载为枚举(正如预期的那样)但是当我手动选中复选框时,列表中填充了字符串。我通过迭代我的列表并使用instanceof针对String和我的枚举检查每个值来发现这一点。

当列表包含EL list.contains字符串时,我的工作就是更改列表

from 
List<MyEnum> list;
to 
List<String> list;

有了这个改变,杰克逊似乎仍然很好地序列化和反序列化我的复选框值,我可以使用EL来检查包含枚举的列表。