Сообщения лиц не очищаются при последующих запросах
Дело в следующем:
у вас есть метод bean-компонента, который анализирует файл, и в случае сбоя анализа добавляется сообщение об ошибке, а в случае успешного анализа - сообщение об успешном выполнении.
Но когда вы выполняете последовательные операции: сбой> успех, я ожидаю, что сообщение об ошибке исчезнет и появится сообщение об успехе, но в результате все равно будет сообщение об ошибке, и к нему будет добавлено сообщение об успехе.
Очистка Списка сообщений перед добавлением сообщения не является решением, поскольку список уже очищен, если вы попытаетесь напечатать размер списка сообщений перед добавлением сообщения, в обоих случаях это будет 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 ответа
Наконец, я попробовал решение контекстного параметра в последней версии 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
надеюсь, что это поможет.
Я в 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));
Я много боролся, и, наконец, исправить было очень просто, будь то простые лица или старые лица, просто добавьте redisplay = false.
Ниже приведен фрагмент кода.
<p:messages id="globalMessages" global-only="true" redisplay="false">
<p:autoUpdate/>
</p:messages>