如何压制JSF警告:无法解析NavigationCase的结果:puh-repair.xhtml

时间:2016-03-29 17:25:38

标签: jsf jsf-2

我遇到警告问题:Could not resolve NavigationCase for outcome:...

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

警告似乎没有 影响到我的应用程序,因为我利用JSF 2与Mojarra 2.2.8和Primefaces 3.5的隐式导航。我没有定义任何导航案例 在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;
    }

}

2 个答案:

答案 0 :(得分:0)

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

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

因为根据警告:

WARNUNG:JSF1064:资源/common-content.xhtml无法解析

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

答案 1 :(得分:0)

我解决了警告但遇到了实际问题。

我更改了以下代码段

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

我添加了静态&#34; / main-content&#34;方法"mainContentController.getContent()"的返回值的路径,该方法属于动态表达式语言语句#{mainContentController.getContent()。

结果为<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)都产生完全相同的路径,但容器的行为是不同的。