Сообщения лиц не очищаются при последующих запросах - PullRequest
1 голос
/ 21 ноября 2011

Случай таков:

у вас есть метод bean-компонента, который анализирует файл, и в случае сбоя синтаксического анализа добавляется сообщение об ошибке, а в случае успешного анализа - сообщение об успешном завершении.Но когда вы выполняете последовательные операции: сбой> успех, я ожидаю, что сообщение об ошибке исчезнет и появится сообщение об успехе, но в результате все еще будет сообщение об ошибке, и к нему будет добавлено сообщение об успехе.

Очистка MessageList перед добавлением сообщения не является решением, поскольку список уже очищен, и если вы попытаетесь напечатать размер списка сообщений перед добавлением сообщения, в обоих случаях он будет равен 0.

Так, каково решение?удалить сообщение об ошибке в случае успеха и наоборот?

Бин:

@Component("mybean")
@Scope("view")
public class MyBean {

    try {
        myservice.parseFile(file);
    } catch (Exception e) {
        FacesMessage msg = new FacesMessage();
        msg.setSeverity(FacesMessage.SEVERITY_FATAL);
        msg.setSummary("Invalid file.");
        facesContext.addMessage(null, msg);
        return;
    }

    FacesMessage msg = new FacesMessage();
    msg.setSeverity(FacesMessage.SEVERITY_INFO);
    msg.setSummary("Success");
    facesContext.addMessage(null, msg);

}

Просмотр:

<h:form>
    <ace:fileEntry id="fileEntryComp"
        label="File Entry"
        relativePath="uploaded"
        fileEntryListener="#{mybean.listener}" /> 

    <h:commandButton value="Upload File" />
    <h:messages  styleClass="myclass" infoStyle="Color:blue;" errorStyle="Color:red;" fatalStyle="margin-right: 85%; Color:red;" globalOnly="true"/> 
    <h:messages for="fileEntryComp" style="display:none;"/> <!-- to hide the faces development message-->     
</h:form>

ОБНОВЛЕНИЕ:

я попробовал даже обходной путь здесь:

Возможно удалить компонентное содержимое HTML с помощью JSF

, чтобы очистить div сообщений перед добавлением новых сообщений,но не новое, я не знаю, откуда он получает старое сообщение.

UPDATE2:

я даже попробовал два обходных пути, упомянутых здесь:

http://www.icefaces.org/JForum/posts/list/19753.page#71521

1- Добавление контекстного параметра:

<context-param>
    <param-name>org.icefaces.messagePersistence</param-name>
    <param-value>false</param-value>
</context-param> 

тоже не работает.

2- Очисткасохраненная коллекция глобальных сообщений:

я пробовал это решение:

 List<FacesMessage> globals = (List<FacesMessage>) facesContext.getViewRoot().getAttributes().get("org.icefaces.event.saved_global_faces_messages");
 if (globals != null) {
     globals.clear();
 }

, но я всегда получаю следующее исключение:

Caused by: java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableCollection.clear(Collections.java:1037)
    at com.xeno.phoneSuite.beans.DepartmentBean.listener(DepartmentBean.java:176)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at org.icefaces.component.fileentry.FileEntry.broadcast(FileEntry.java:311)
    ... 92 more

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

наконец, я попытался найти решение для параметра контекста в последней версии ICEfaces 2.1 Beta 2 , и оно отлично работает:

<context-param>
        <param-name>org.icefaces.messagePersistence</param-name>
        <param-value>false</param-value>
  </context-param>

http://wiki.icefaces.org/display/ICE/ICEfaces+2.1.0+Beta+2+Release+Notes#ICEfaces2.1.0Beta2ReleaseNotes-downloads

надеюсь, что это поможет.

0 голосов
/ 02 августа 2015

Я нахожусь в Icefaces 3.3 и у меня была похожая проблема.Я решил это, используя следующий код (о, кстати, я также вижу, что @BalusC уже указал на такое решение в своих комментариях):

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

Помещение над куском кода перед отправкой нового сообщения, подобного этому, следует очистить старое сообщение и заменить его новым сообщением My Message:

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "My Message", null));
...