JSF 2.2表条件渲染不起作用

时间:2014-05-28 16:27:12

标签: jsf-2.2 glassfish-4 java-ee-7

我尝试使用以下标记-libs显示带有@Entity信息的简单表格:

xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"

这里是映射的实体属性,布尔值:

@NotNull
@Column(name = "ACTIVE", columnDefinition = "BIT", length = 1)
private boolean active;

//... getters and setters
public boolean getActive() {
    return active;
}

public boolean isActive() {
    return active;
}

public void setActive(boolean active) {
    this.active= active;
}

ps。:通过调试支持bean,我得到了所需的列表。

这是我的.xhtml(jsf页)代码段:

<ui:repeat var="u" value="#{usersList}">
            <tr>
                <td>#{u.name}</td>
                <td>#{u.login}</td>
                <td>#{u.email}</td>
                <td>
                    <c:choose>
                        <c:when test="${u.active}">
                            <span style="color: green" class="glyphicon glyphicon-ok"></span>
                        </c:when>
                        <c:otherwise>
                            <span style="color: red"
                                                            class="glyphicon glyphicon-remove"></span>
                        </c:otherwise>
                    </c:choose>
                </td>
            </tr>
        </c:when>
</ui:repeat>

如果列表不为空,则显示空消息,并且不显示任何行。

如果我强制显示行,删除条件渲染,我会收到以下错误:

java.lang.IllegalArgumentException: Cannot convert 1 of type class java.lang.Long to class java.lang.Boolean

属性有效

我在问之前尝试了一些解决方案,如下:

How does Java expression language resolve boolean attributes? (in JSF 1.2)

javax.el.PropertyNotFoundException when trying to resolve Boolean properties in EL

更新1 :查看我的代码,我意识到我为空测试一个对象,而不是一个列表,也更新了我的代码段,因此,显示行的条件现在好了,但活动属性问题,仍然抛出错误。

1 个答案:

答案 0 :(得分:0)

问题是JSF标签(例如ui:repeat)在不同的(稍后)阶段评估,然后是JSTL标签(例如c:when)。因此,在评估c:when语句时,您的用户列表的值不可用。有时这会导致奇怪的行为,因此看起来值可用。请查看this answer以获取一些详细信息。

您应该使用某些JSF组件的呈现属性:

<c:choose>
  <c:when test="${u.active}">
     <span style="color: green" class="glyphicon glyphicon-ok"></span>
  </c:when>
  <c:otherwise>
    <span style="color: red" class="glyphicon glyphicon-remove"></span>
  </c:otherwise>
</c:choose>

变成:

<h:panelGroup rendered="#{u.active}">
  <span style="color: green" class="glyphicon glyphicon-ok"></span>
</h:panelGroup>
<h:panelGroup rendered="#{not u.active}">
  <span style="color: red" class="glyphicon glyphicon-remove"></span>
</h:panelGroup>

你也可以将它用于这样的值:

<h:outputText rendered="#{u.active}" value="#{u.name}" />

另见: