如何抑制 JSF 警告:无法解决结果的导航案例:puh-repair.xhtml

How to supress JSF warning: Could not resolve NavigationCase for outcome: puh-repair.xhtml

我对警告有疑问:Could not resolve NavigationCase for outcome:...

com.sun.faces.application.resource.ResourceHandlerImpl logMissingResource
WARNUNG: JSF1064: Resource /common-content.xhtml not resolvable

警告好像没有 影响到我的应用程序,因为我利用带有 Mojarra 2.2.8 和 Primefaces 3.5 的 JSF 2 的隐式导航。我没有定义任何导航案例 在 faces-config.xml

有趣的是,导航本身可以正常工作,但警告会添加到 Faces 消息队列中,因此会在请求后显示在任何消息中。

下面的代码显示了我的 home.xhtml 其中

<h:body class="page-container">
    <p:growl id="message"></p:growl>

        <div class="page-layout-container">
            <div>   
                <ui:insert name="header">
                    <ui:include src="/template/puh-common-header.xhtml" />
                </ui:insert>            
            </div>
            <div> 
                <ui:insert  name="menu">
                            <ui:include src="/template/puh-menu.xhtml" />
                        </ui:insert>
            </div>
            <div>
                <h:panelGroup id="content" layout="block">
                <ui:insert name="content">
                    <ui:include src="/main-content/#{mainContentController.getContent()}"/>
                </ui:insert>
                </h:panelGroup>
            </div>          
            <div>
                <ui:insert name="footer">
                    <ui:include src="/template/puh-common-footer.xhtml" />
                </ui:insert>
            </div>

        </div>

</h:body>

该页面仅包含适当的作品。我认为这是问题所在。 结果总是 home.xhtml JSF 警告引用的页面只是组合。

编辑:

mainContentController 的支持 bean 实现:

@Named("mainContentController")
@SessionScoped
public class MainContentController implements Serializable {    

    /**
     * 
     */
    private static final long serialVersionUID = -6818446964735212239L;



    private Logger logger = LogManager.getLogger(MainContentController.class);

    public static String PAGE_HOME = "puh-home.xhtml";

    public static final String CONTENT_ERROR = "puh-error.xhtml";

    public static String CONTENT_COMMON = "puh-common-content.xhtml";

    public static String CONTENT_CONTACT = "puh-contact.xhtml";

    public static String CONTENT_REPAIR = "puh-repair.xhtml";

    public static String CONTENT_IMPRESSUM = "puh-impressum.xhtml";

    private String content = CONTENT_COMMON;

    private void showControllerState() {
        logger.info("Page "+ content + ".");        
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Page "+ content + "."));
    }

    public String homeAction() {
        content = CONTENT_COMMON;               
        showControllerState();
        return content;
    }

    public String serviceAction() {
        content = CONTENT_REPAIR;               
        showControllerState();
        return content;
    }

    public String impressumAction() {
        content = CONTENT_IMPRESSUM;
        showControllerState();
        return content;
    }

    public String contactAction() {
        content = CONTENT_CONTACT;
        FacesContext facesContext = FacesContext.getCurrentInstance();
        String outcome = PAGE_HOME+"?faces-redirect=true"; // Do your thing?

        // Because of Captcha Image   
        facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, outcome); 
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Redirect "+ content + "."));           
        showControllerState();
        return content;
    }


public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

}

此处托管bean的功能是什么return?:

<ui:insert name="content">
<ui:include src="/main-content/#{mainContentController.getContent()}"/>
</ui:insert>

因为根据警告:

警告:JSF1064:资源 /common-content.xhtml 不可解析

您所引用的文件似乎不存在于您指定的位置。如果您发布项目的文件结构也会有所帮助。

我解决了警告,但 运行 变成了真正的问题。

我更改了以下代码片段

<div>
   <h:panelGroup id="content" layout="block">
     <ui:insert name="content">
       <ui:include src="/main-content/#{mainContentController.getContent()}"/>
     </ui:insert>
  </h:panelGroup>
</div> 

我将静态“/main-content”路径添加到属于动态表达式语言语句#{mainContentController.getContent() 的方法"mainContentController.getContent()" 的return 值。

结果是<div> <h:panelGroup id="content" layout="block"> <ui:insert name="content"> <ui:include src="#{mainContentController.getContent()}"/> </ui:insert> </h:panelGroup> </div>

支持 bean 看起来像这样

public class MainContentController implements Serializable {

   private Logger logger = LogManager.getLogger(MainContentController.class);

   public static String PAGE_HOME = "puh-home.xhtml";

   public static String CONTENT_COMMON = "/main-content/puh-common- content.xhtml";

   private String content = CONTENT_COMMON; 

   public String getContent() {
     return content;
   }

   public void setContent(String content) {
     this.content = content;
   }

   private void handleNavigation() {
      logger.info("Navigate to page "+  content + ".");             
      FacesContext facesContext = FacesContext.getCurrentInstance();
      String outcome = PAGE_HOME+"?faces-redirect=true";          facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, outcome);           
    }

    public String homeAction() {
        content = CONTENT_COMMON;               

        handleNavigation();
        return content;
  }
}

我现在对这种行为没有真正的答案,但我认为 问题与JSF的生命周期有关。

要强调的问题。

有区别

1. <ui:include src="/main-content/#{mainContentController.getContent()}"/>

2. <ui:include src="#{mainContentController.getContent()}"/>

两个语句(1 和 2)导致完全相同的路径,但容器的行为不同。