【发布时间】:2018-07-13 02:06:29
【问题描述】:
假设我有一个
<h:form>
<p:commandButton value="Add no message">
<p:ajax listener="#{backingBean0.action0()}"
update="@form"/>
</p:commandButton>
<p:messages id="messages"/>
</h:form>
我向FacesContext.addMessage 提供了错误的客户ID(想象一下现实世界中的一个错字):
@Named
@ViewScoped
public class BackingBean0 implements Serializable {
private static final long serialVersionUID = 1L;
public void action0() {
FacesContext.getCurrentInstance().addMessage("inexisting",
new FacesMessage(FacesMessage.SEVERITY_ERROR,
"summary",
"detail"));
}
}
为什么BackingBean0.action0中创建的消息会添加到p:messages中?我希望不会添加该消息,因为已指定一个非空且非空的客户端 ID,它与客户端 [1] 上的任何 p:messages 都不匹配。
消息似乎可靠地添加到与客户端 ID 匹配的 p:messages 元素(并且仅添加到它们)。 FacesContext.addMessage 状态的 Javadoc
如果 clientId 不为 null,则将 FacesMessage 附加到与指定客户端标识符关联的消息集。如果 clientId 为 null,则假定此 FacesMessage 不与任何特定组件实例关联。
参数:
clientId - 与此消息关联的客户端标识符(如果有) message - 要附加的消息
抛出: IllegalStateException - 如果在释放此实例后调用此方法 NullPointerException - 如果消息为 null
当然,这引发了一个问题,非关联消息可能意味着什么(它是否显示或在某处排队 - 在这种情况下,关联只是一个解释力为零的词)。
然后是
与此消息关联的客户端标识符(如果有)
在我的解释中,这意味着如果没有匹配的客户端 ID,则不会显示消息,但同样,这在很大程度上取决于关联在此上下文中的含义。
这个问题显然不是专注于解决通过指定正确的客户端ID来完成的问题,而是要理解这一点。
我在 Primefaces 6.2 中体验过。
[1] 实际上,我希望抛出异常,因为这样更优雅,更省时,但由于我看不到的原因,这可能是个坏主意。
【问题讨论】:
-
clientId - The client identifier with which this message is associated (if any) message - The message to be appended此 id 指的是引发消息的组件,而不是用于显示消息的目标组件。以某种方式考虑验证消息,这些消息与组件 id 一起显示。看看the showcase。关于组件 id 不存在时抛出的异常,这可能是规范范围内讨论的内容。 -
@XtremeBiker 感谢您的解释,现在更清楚了(Melloware 在下面的回答也涵盖了它)。我希望 JavaEE 世界将在 J4EE 过渡的过程中开放,以便更容易地提出像提议的异常这样的建议。您是否偶然了解了 JSF 在其新家中的状态?
标签: jsf primefaces