我的真实用途有点不同,但我已将问题缩小到您在下面看到的代码。当你点击" go nothere"按钮,一切都很好,无论你点击多少次。但是当你点击"去某处"时,你会得到一个IllegalStateException,"组件ID j_idt3:fnord1已经在视图中被找到"。为什么它可以很好地返回null,但是当你返回导航字符串时却没有?
我已经阅读this answer,这是相关的,但对我的理解还不够。如果jsf规范(或某些此类来源)中的某个部分是相关的,我非常感谢指出它的答案。
/secure/application/sample.xhtml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:body>
<h:form>
<ul>
<li><h:commandLink action="#{sample.goNowhere}" value="go nowhere"/></li>
<li><h:commandLink action="#{sample.goSomewhere}" value="go somewhere"/></li>
</ul>
<h:selectOneMenu id="fnord0" binding="#{components.menuAddForm}">
<f:selectItem id="fnord1" itemLabel="---" noSelectionOption="true"/>
</h:selectOneMenu>
</h:form>
</h:body>
</html>
我不需要ID,只是让错误更容易阅读。
&#34;组分&#34;是请求范围的hashmap,遵循this answer about component bindings中的建议。
Sample.java
package com.example;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class Sample
{
private static final String somewhere = "/secure/application/sample.xhtml";
public String goNowhere()
{
System.out.println("goNowhere()");
return null;
}
public String goSomewhere()
{
System.out.println("goSomewhere()");
return somewhere;
}
}
答案 0 :(得分:0)
隐式导航需要视图的ID,更改
private static final String somewhere = "/secure/application/sample.xhtml";
要
private static final String somewhere = "/secure/application/sample";
答案 1 :(得分:0)
我现在看到,你的命名空间导入错误,你有哪个版本的mojarra? 旧的应该全部在
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
如果你有更新版本(推荐并且几乎是强制性的),你应该拥有jcp命名空间:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
答案 2 :(得分:0)
我使用的是jsf 2.2.4。我无法通过后续版本(2.2.5,2.2.6,2.2.7)重现该问题。 2.2.5 release notes针对关键字“重复”,“ID”和“导航”修复了多个错误。我不明白他们是如何直接解决这个问题的。尽管如此,我还是将这个问题搞砸了。
我很高兴发现我对这个功能的理解是正确的,我的问题只是一个实现错误。
对于想要在行动中看到此错误的任何人,here's an SSCCE。