Перенаправление со страницы ошибок, когда нет ошибок для отображения - PullRequest
0 голосов
/ 15 февраля 2012

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

У меня есть несколько правил в pages.xml, которые указывают на страницу с ошибкой, например:

<!-- pages.xml -->
  <exception class="org.jboss.seam.framework.EntityNotFoundException"
    log-level="warn">
    <redirect view-id="/error.xhtml">
      <message severity="warn">#{messages['jsf.RecordNotFound']}</message>
    </redirect>
  </exception>

Попробовав несколько неудачных выражений EL для проверки отсутствия сообщений, я добавил вспомогательный компонент для проверки:

<!-- pages.xml -->
  <page view-id="/error.xhtml">
    <action execute="#{facesMessagesUtil.getGlobalMessagesCount()}" />
    <navigation>
      <rule if-outcome="none">
        <redirect view-id="/home.xhtml"/>
      </rule>
    </navigation>
  </page>

.

//FacesMessagesUtil.java

   import javax.faces.context.FacesContext;
   import org.jboss.seam.faces.FacesMessages;

   ...

   public String getGlobalMessagesCount()
   {
      log.info("currently {0} global facesMessages (seam)", FacesMessages.instance().getCurrentGlobalMessages().size());
      log.info("found messages in faces context: {0}", FacesContext.getCurrentInstance().getMessages().hasNext());
      log.info("got maximum severity: {0}", FacesContext.getCurrentInstance().getMaximumSeverity());

      if (!FacesContext.getCurrentInstance().getMessages().hasNext())
      {
         return "none";
      }
      return "some";
   }

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

16:41:41,908 INFO  [FacesMessagesUtil] currently 0 global facesMessages (seam)
16:41:41,908 INFO  [FacesMessagesUtil] found messages in faces context: false
16:41:41,908 INFO  [FacesMessagesUtil] got maximum severity: null
  1. Есть ли класс в шве 2, который позволит мне проверить, есть ли какие-либо сообщения?
  2. Есть ли выражение EL, которое может выполнить эту проверку без дополнительного компонента?

1 Ответ

0 голосов
/ 23 февраля 2012

Насколько я могу судить по моим исследованиям, проблема здесь в том, как шов передает FacesMessages из одного JSF-контекста в другой.По сути, сообщения, похоже, были удалены в какой-либо другой компонент шва во время применения правил pages.xml, а затем возвращены к моменту рендеринга страницы.Сейчас я обошел эту проблему, показав сообщение «без ошибок» (обратите внимание, что глобальные сообщения присутствуют во время рендеринга страницы):

<h:outputText id="noErrorsMessage"
    rendered="#{empty org.jboss.seam.international.statusMessages.currentGlobalMessages}">
    #{messages['jsf.NoErrors']}
</h:outputText>

и с некоторыми жестко заданными правилами перенаправления в одном из моих компонентов.

...