Причины правила навигации 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 варианта:
Исправить текущий вид ID.
<from-view-id>/Components/TopBar.xhtml</from-view-id>
видимо неправильно. Вы можете найти правильный вариант следующим образом:System.out.println(FacesContext.getCurrentInstance().getViewRoot().getViewId());
Обычно это тот, который соответствует контекстно-зависимому URI в адресной строке браузера, если вы не используете POST для навигации по страницам. Используйте это значение в
<from-view-id>
,Избавьтесь от случаев навигации в целом и положитесь на неявную навигацию. Удалить
<navigation-case>
в целом изfaces-config.xml
и измените значение результата и метод действия, как показано ниже:private final String resultsOutcome = "/protected/SearchResults.xhtml"; public String search() { return resultsOutcome; }
NavigationHandler
подход был также довольно неуклюжим. Даже в навигационных случаях просто возвращайте результат, а не возитесь сNavigationHandler
,