7

仅当 JSF 队列中有全局消息时,我才尝试显示一个块。

我尝试使用rendered="#{not empty facesContext.getMessageList(null)}",但它总是被评估为假。

我发现的唯一方法是创建一个自定义 EL 函数并在 java 中测试它。

例如。: 我的 el 函数:

public static boolean isFacesGlobalMessages() {
  return ! FacesContext.getCurrentInstance().getMessageList(null).isEmpty();
}

JSF 页面:

<h:panelGroup class="block1" layout="block" rendered="#{el:isFacesGlobalMessages()}">
  <div class="block-warn-body">
    <rich:messages id="msg" globalOnly="true"/>
  </div>
</h:panelGroup>

我正在使用 Mojarra 2.1.5。

我错过了什么吗?谢谢 !

编辑:尝试了以下建议,但到目前为止没有运气:

  • #{not empty facesContext.getMessageList(null)}-> 总是假的
  • #{! facesContext.getMessageList(null)}-> 错误
  • #{! empty facesContext.getMessageList(null)}-> 总是假的
  • #{fn:length(facesContext.getMessageList(null)) > 0}-> 总是假的
  • #{not empty facesContext.messageList(null)}-> 错误:找不到方法消息列表
  • #{not empty facesContext.messageList}-> 如果是验证错误,则返回 true(我只希望全局错误为 true)
  • #{! facesContext.getMessageList(null).isEmpty()}-> 抛出 IllegalAccessException:类 javax.el.BeanELResolver 无法访问带有修饰符“public”的类 java.util.Collections$UnmodifiableCollection 的成员
4

3 回答 3

18

无需自定义 EL 功能

试试这个

rendered="#{not empty facesContext.messageList}"

编辑

自己没试过,但是试试

rendered="#{not empty facesContext.messageList(null)}"

一个想法...

 rendered="#{not facesContext.validationFailed and not empty facesContext.messageList}"
于 2012-07-31T09:30:22.933 回答
2

我知道这是一个旧线程,但是在努力寻找难以捉摸的解决方案之后,我找到了对这种行为的解释,并且由于我无法在任何地方找到这种解释(不知道为什么),我认为这可能会有所帮助。

我做了一个 el 函数略有不同:

public static boolean hasMessages(String clientId) {
    return !FacesContext.getCurrentInstance().getMessageList(clientId).isEmpty();
}

不同的是参数clientId。此函数的行为与使用#{not empty facesContext.getMessageList(clientId)}. 调试代码,我注意到当我用 调用函数时clientId = null,函数clientId内部的值实际上是""(空字符串)。

之后,我查阅了EL 3.0 Spec,发现:

第 1.23 节 - 类型转换

每个表达式都在预期类型的​​上下文中进行评估。表达式评估的结果可能与预期类型不完全匹配,因此应用以下部分中描述的规则。[...]

第 1.23.2 节 - 将 A 强制转换为字符串

如果 A 为空:返回 "" [...]

所以,我认为没有办法clientId = null通过将null值作为参数传递来请求消息。唯一的方法是拥有一个不使用参数或测试参数是否设置为空字符串的函数。

于 2016-04-11T21:35:42.870 回答
1

试试这个:

rendered="#{not empty facesContext.getMessageList(null)}

代替:

rendered="#{not empty facesContext.messageList(null)}"

在丹尼尔的回答中。

或者这个:

rendered="#{not empty facesContext.getMessageList('inputForm')}

其中'inputForm'是:

<h:form id="inputForm">
...
</h:form>

如果您只想将其发送到页面上的几种形式中的一种。

于 2015-07-31T04:58:49.097 回答