0

如果没有要显示的错误消息(例如,如果用户为错误页面添加书签),我希望我的 seam 应用程序的错误页面重定向到主页。

我在 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 表达式来尝试检查没有消息之后,我添加了一个支持 bean 来进行检查:

<!-- 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 表达式可以在没有额外 bean 的情况下执行此检查?
4

1 回答 1

0

到目前为止,我可以根据我的调查得出最好的结论,这里的问题是接缝如何将 FacesMessages 从一个 JSF 上下文转发到另一个。本质上,在应用 pages.xml 规则时,消息似乎已被删除到其他一些接缝组件,然后在页面呈现时返回。我现在通过显示“无错误”消息解决了这个问题(请注意,在页面呈现期间存在全局消息):

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

并在我的一个 bean 中使用一些硬编码的重定向规则。

于 2012-02-23T03:49:13.710 回答