导航规则导致JSF1064:无法查找或提供资源

时间:2015-01-22 17:01:40

标签: jsf navigation faces-config

我有以下xhtml页面,它包含在我项目中其他页面的主要部分中:

<ui:composition  xmlns="http://www.w3.org/1999/xhtml"
             xmlns:f="http://java.sun.com/jsf/core"
             xmlns:h="http://xmlns.jcp.org/jsf/html"
             xmlns:ui="http://java.sun.com/jsf/facelets"
             xmlns:p="http://primefaces.org/ui">
<h:head>
    <title></title>
</h:head>
<h:form>  
    <p:menubar>
        <p:menuitem value="Home" url="/protected/personal/HomeCalendar.xhtml" icon="ui-icon-home"/>
        <p:menuitem value="#{topbarBean.username}" url="#" style="text-decoration: underline" />
        <f:facet name="options">
            <p:inputText style="margin-right:20px" placeholder="Search"  value="#{searchBean.searched}"/>
            <p:commandButton action="#{searchBean.search()}" type="submit" icon="ui-icon-search" />
        </f:facet>
       </p:menubar>
</h:form>
</ui:composition>

这是我写过的导航规则:

<navigation-rule>
    <from-view-id>/Components/TopBar.xhtml</from-view-id>
    <navigation-case>
        <from-action>#{searchBean.search()}</from-action>
        <from-outcome>searchingResults</from-outcome>   
        <to-view-id>/protected/SearchResults.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

这个引用的Bean:

@RequestScoped
@ManagedBean
public class SearchBean implements Serializable {

private String searched;
private final String resultsOutcome = "searchingResults";
private List<User> users;
private List<Event> events;

@EJB
UserFacade uf;

@EJB
UserManager um;

@EJB
EventFacade ev;

@PostConstruct
public void init(){
    try {
        setEvents(um.getEventsVisibilityMasked(um.getLoggedUser().getId()));
    }
    catch (NotFoundException ex) { 
        Logger.getLogger(SearchBean.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void setSearched(String searched) {
    this.searched = searched;
}

public String getSearched() {
    return searched;
}


public void search() {
    FacesContext fc = FacesContext.getCurrentInstance();
    fc.getApplication().getNavigationHandler().handleNavigation(fc, null, resultsOutcome);
}

public List<User> getUsers(){
    return users;
}
public void setUsers(List<User> users){
    for(User user:users)
    this.users.add(user);
}

public List<Event> getEvents(){
    return events;
}
public void setEvents(List<Event> events){
    for(Event event:events)
    this.events.add(event);
}    
}

错误如下:  JSF1064:无法找到或提供资源,/protected/personal/searchingResults.xhtml。

此路径未在任何地方指定,如果它有用,我可以使用以下结构:

-Index,xhtml
-Web Pages { components , protected}
-components{TopBar.xhtml}
-protected {event,persona,user,SearchResults.xhtml}
-event{eventCreate,eventPage,eventEdit}
-personal{HomeCalendar,ManageSettings,ManageInvitations}

我不明白问题是关于导航规则还是下一个xhtml页面。

1 个答案:

答案 0 :(得分:1)

如果JSF无法找到匹配的导航规则,就会发生这种情况。然后它会切换到隐式导航。即结果将用作相对于当前上下文的实际视图ID。

显然当前的视图ID位于/protected/personal的某个位置。 searchingResults与任何导航规则不匹配的结果将触发隐式导航至/protected/personal/searchingResults.xhtml

您有2个选项:

  1. 修复当前视图ID。 <from-view-id>/Components/TopBar.xhtml</from-view-id>显然是错误的。您可以按如下方式找到正确的:

    System.out.println(FacesContext.getCurrentInstance().getViewRoot().getViewId());
    

    它通常是与浏览器地址栏中的上下文相关URI匹配的那个,只要您不使用POST进行页面到页面的导航即可。在<from-view-id>

  2. 中使用此值
  3. 完全摆脱导航案例并依赖隐式导航。从<navigation-case>完全删除faces-config.xml并更改结果值和操作方法,如下所示:

    private final String resultsOutcome = "/protected/SearchResults.xhtml";
    
    public String search() {
        return resultsOutcome;
    }
    

    NavigationHandler方法也非常笨拙。即使有导航案例,也只需直接返回结果,而不是摆弄NavigationHandler

  4. 另见: