导航到同一页面时,“已在视图中找到组件”,uicomponent绑定

时间:2014-05-26 22:52:55

标签: java el jsf-2.2

我的真实用途有点不同,但我已将问题缩小到您在下面看到的代码。当你点击" 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;
  }
}

3 个答案:

答案 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