假设我有
<h:form>
<p:commandButton value="Add no message">
<p:ajax listener="#{backingBean0.action0()}"
update="@form"/>
</p:commandButton>
<p:messages id="messages"/>
</h:form>
我给你提供了错误的客户id
FacesContext.addMessage
(想象一下现实世界中的一个打字错误):
@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
? 我希望消息不会被添加,因为已经指定了一个非null和非空的客户端id,它与任何
p:留言
在客户端[1]。
消息似乎被添加到了
p:留言
元素可靠地匹配客户端id(并且仅与之匹配)。的Javadoc
FacesContext。添加消息
州
如果clientId不为null,则将FacesMessage附加到与指定客户端标识符关联的消息集中。如果clientId为null,则假定此FacesMessage与任何特定组件实例都没有关联。
参数:
clientId—与此消息关联的客户端标识符(如果有)
消息-要附加的消息
抛出:
IllegalStateException-如果在释放此实例后调用此方法NullPointerException-如果消息为null
当然,这就提出了一个问题,一条没有关联的消息可能意味着什么(它是否被显示,或者是否在某个地方排队——在这种情况下,关联只是一个没有解释力的词)。
然后是
与此消息关联的客户端标识符(如果有)
这在我的理解中意味着,如果没有与客户机id匹配的消息,则不会显示,但这在很大程度上取决于关联在这种上下文中的含义。
显然,这个问题的重点不是通过指定正确的客户端id来解决问题,而是理解这一点。
我用Primefaces 6.2体验到了这一点。
[1] 实际上,我希望抛出一个异常,因为这样做更优雅,节省时间,但这可能是个坏主意,原因我不明白。