Причины правила навигации JSF1064: невозможно найти или обслужить ресурс

У меня есть следующая 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>

а это упомянутый боб:

@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}

Я не понимаю, касается ли проблема правила навигации или следующей страницы HTML.

1 ответ

Это может произойти, если JSF не может найти соответствующее правило навигации. Затем он переключится на неявную навигацию. Т.е. результат будет использоваться в качестве фактического идентификатора представления относительно текущего контекста.

Видимо, идентификатор текущего представления находится где-то в /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. Избавьтесь от случаев навигации в целом и положитесь на неявную навигацию. Удалить <navigation-case> в целом из faces-config.xml и измените значение результата и метод действия, как показано ниже:

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

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

Смотрите также:

Другие вопросы по тегам