我尝试使用
有条件地渲染一个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
答案 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来检查包含枚举的列表。