如何从FacesContext中删除FacesMessages?

gek*_*ish 15 jsf

在我的屏幕中,我有一个下拉(选择框),在选择该下拉列表中的任何选项时,我使用javascript/css - display:none和display:block在选择框旁边显示一个或多个文本框.所有这些输入控件都采用相同的jsf格式.每个输入控件都有自己的验证器.问题是假设用户从选择框中选择option1并且没有输入值或输入错误的值 inputbox1,我在Validator中添加了一个自定义FacesMessage并且被正确显示并假设用户第二次选择option2并输入inputbox2的值不正确,然后在验证器中添加另一个FacesMessage.但现在两个消息都显示 - 表示 - inputbox1和inputbox2的消息 - 这是错误的我的假设是,这是因为它们以相同的形式存在,并且它们的实例在FacesContext和UIView中尚未被销毁.我决定以这种方式删除这些消息

Iterator<FacesMessage> msgIterator = FacesContext.getCurrentInstance().getMessages();
    while(msgIterator.hasNext())
    {
        msgIterator.next();
        msgIterator.remove();
    }
Run Code Online (Sandbox Code Playgroud)

但这有时会产生java.util.NoSuchElementException org.apache.myfaces.shared_impl.renderkit.html.HtmlMessagesRendererBase $ MessagesIterator.next

那2个问题:

1)以这种方式删除FacesMessages有什么问题?我正在使用myfaces-api-1.2.3.jar和myfaces-impl-1.2.3.jar

2)有更好的方法来处理我的场景吗?我只想在每次处理jsf请求时显示相关消息

谢谢

mmo*_*sen 5

据我所知,这还不够

org.apache.myfaces.context.servlet.FacesContextImpl
Run Code Online (Sandbox Code Playgroud)

(版本:2.0.15,修订版:1364593),有2个消息列表(_orderedMessages_messages),您的方法只清除_orderedMessages.

要清除_messages这样做:

Iterator<String> itIds = FacesContext.getCurrentInstance().getClientIdsWithMessages();
while (itIds.hasNext()) {
    List<FacesMessage> messageList = FacesContext.getCurrentInstance().getMessageList(itIds.next());
    if (!messageList.isEmpty()) { // if empty, it will be unmodifiable and throw UnsupportedOperationException...
        messageList.clear();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是非常脆弱的,因为它依赖于实现细节,但我找不到更好的方法:(

  • 在 JSF2.0 (Mojarra) 中,即使列表不为空,它也会抛出“UnsupportedOperationException”。 (2认同)

gek*_*ish 3

问题不在于我无法从 FacesContext 中删除消息。问题是,每次提交表单时,很少有输入控件(使用 display:none 不会显示这些输入控件),它们保留了一些值 (),因此 Validators 和 Backing Bean 代码为那些不可见的输入控件添加了 FacesMessages FacesContext。现在,每次更改选择选项时,我都会清除其他不必要的表单字段,因此不会添加消息。