如何从FacesContext中删除FacesMessages?

时间:2010-05-27 07:09:33

标签: jsf

在我的屏幕中,我有一个下拉(选择框),在选择该下拉列表中的任何选项时,我会在选择框旁边显示一个或多个文本框,使用javascript / css - display:none并显示:块。所有这些输入控件都采用相同的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();
    }

但这有时会产生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请求时显示相关消息

由于

5 个答案:

答案 0 :(得分:5)

据我所知,这还不够,因为在

org.apache.myfaces.context.servlet.FacesContextImpl

(版本: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();
    }
}

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

我不使用MyFaces,所以我不能详细说明这一点,但在Sun RI(Mojarra)中,大约1。5年前版本1.2_07修复了不可删除的facemessages的错误。

因此,为了达到您想要的效果,请尝试将MyFaces升级到最新版本(他们可能也修复了相同的错误)或替换为Mojarra

答案 3 :(得分:0)

FacesContext context = FacesContext.getCurrentInstance();
Iterator<FacesMessage> it = context.getMessages();
while ( it.hasNext() ) {
    it.next();
    it.remove();
}

答案 4 :(得分:-1)

if (FacesContext.getCurrentInstance().getMessages() != null) {
        FacesContext.getCurrentInstance().getMessages().remove();
    }
相关问题