Хобрук: Ваш путь к мастерству в программировании

Flash-сообщения не отображаются после перенаправления в MyFaces, пока оно работает в Mojarra

У меня есть собственный ExceptionHandlerWrapper для управления ViewExpiredException и другими ошибками.

Идея состоит в том, чтобы поймать ошибку, добавить какое-нибудь сообщение об ошибке и перенаправить (с перенаправлением, а не навигацией) на страницу индекса, где сообщение об ошибке будет отображаться.

    fc.getExternalContext().getFlash().setKeepMessages(true);
    Messages.addFlashError(null, "my message");
    Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
    flash.put("foo", "hello");
    fc.getExternalContext().redirect("index.xhtml");

Однако флэш-сообщения не сохраняются (но в области флэш-памяти присутствует foo).

Это работало в мохарре, но я перешел на myfaces 2.2.4, и оно перестало работать. Любая идея? (также с использованием омнифейсов 1.8.1) Спасибо.


  • Явно ошибка Myfaces 08.08.2014

Ответы:


1

Я просмотрел исходный код MyFaces, и оказалось, что им явно нужен дополнительный Flash#setRedirect() поверх Flash#setKeepMessages(). Хотя Javadoc, по общему признанию, не совсем ясен по этому поводу, я ожидаю, что вызов setRedirect(true) необходим только для атрибутов Flash, а не для сообщений Flash, у которых есть собственный вызов setKeepMessages(true).

Итак, в основном вы должны делать следующее:

fc.getExternalContext().getFlash().setKeepMessages(true);
Messages.addFlashError(null, "my message");
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
flash.put("foo", "hello");
fc.getExternalContext().getFlash().setRedirect(true); // <-- Add this.
fc.getExternalContext().redirect("index.xhtml");

Однако, поскольку вы уже используете служебную библиотеку JSF OmniFaces, которая уже неявно вызывает setKeepMessages(true) при использовании Messages#addFlashXxx(), а также неявно вызывает setRedirect(true) при использовании Faces#redirect(), вы можете обойтись только следующим, который делает то же самое, что и "беспорядок" выше:

Messages.addFlashGlobalError("my message");
Faces.setFlashAttribute("foo", "hello");
Faces.redirect("index.xhtml");

Нет необходимости в пользовательском прослушивателе фазы.

09.08.2014
  • Что на самом деле делает Flash#setRedirect()? 19.09.2015
  • @Tiny: он предназначен для того, чтобы флэш-сообщения пережили двойное перенаправление, если таковое имеется. 19.09.2015

  • 2

    Я временно решил это с помощью PhaseListener. Мне это не нравится, но пока работает

    Что я делаю, так это всякий раз, когда я добавляю флэш-сообщение, я также помещаю его в область флэш-памяти:

         Messages.addFlash(null, new FacesMessage(severity, summary, detail));
    
        context.getExternalContext().getFlash().put("messages", context.getMessageList());
    

    Затем я восстанавливаю их в PhaseListener

    public void beforePhase(final PhaseEvent event) {
        FacesContext facesContext = event.getFacesContext();
    
        if (PhaseId.RENDER_RESPONSE.equals(event.getPhaseId())) {
            if (!facesContext.getResponseComplete()) {
                this.restoreMessages(facesContext);
            }
        }
    }
    private int restoreMessages(final FacesContext facesContext) {
        final Object flash = facesContext.getExternalContext().getFlash().get("messages");
        if (flash != null) {
            List<FacesMessage> messages = (List<FacesMessage>) flash;
    
    
            int restoredCount = messages.size();
            for (Object element : messages) {
                facesContext.addMessage(null, (FacesMessage) element);
            }
            return restoredCount;
        }
        return 0;
    }
    
    07.08.2014
    Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..