【问题标题】:jsf 2.0 managed bean's property not found未找到 jsf 2.0 托管 bean 的属性
【发布时间】:2012-12-17 03:08:36
【问题描述】:

JSF 错误:/fstation/search.jspx(24,62) '#{vManager.fStations}' Property 'fStations' not found on type vm.beans.VisitorManagertype

vManager 是我管理的:


搜索.jspx

<h:form>
     <h:dataTable value="#{vManager.fStations}" var="row">
          <h:column>
              <f:facet name="header"><h:outputText value="ID"/></f:facet>
              <h:outputText value="#{row.id}"/>
          </h:column>
          <h:column>
               <f:facet name="header"><h:outputText value="NAME"/></f:facet>
              <h:outputText value="#{row.name}"/>
          </h:column>
     </h:dataTable>
</h:form>

托管代码如下:

package vm.beans;
import vm.model.DataManager;
import java.util.ArrayList;
import java.util.List;

public class VisitorManager {

    private List<FireStation> fStations;
    private DataManager dataManager = new DataManager();
    private String fireStationName;

    public String searchFireStation(){
        //String fName =fStation.getName();
        System.out.println("this is "+fireStationName);
        return null;
    }

    public void deleteStation(){    
    }

    /*
    * getter and setter
    */

    public String getFireStationName(){
        return fireStationName;
    }

    public void setFireStationName(String name1){
        this.fireStationName=name1;
    }

    public List<FireStation> getFStations(){
        //return dataManager.getFireStations();
        fStations = new ArrayList<FireStation>();
        fStations.add(new FireStation("001", "a1"));
        fStations.add(new FireStation("002", "a2"));
        fStations.add(new FireStation("003", "a3"));
        return fStations;
    }

    public void setFStations(List<FireStation> fs){
        this.fStations = fs;
    }
}

【问题讨论】:

  • 请给我们 faces-config.xml 文件...
  • 根据报错信息,bean配置正确,所以faces-config无关。
  • 为避免混淆,您可以直接使用 getter 名称,例如 abc.getName()

标签: jsf jsf-2


【解决方案1】:

如果一个属性名称以两个或多个大写字符开头,那么它会被假定为正是这种情况。 getter getFStations() 表示属性名称为FStations,因此您应该这样访问它:

<h:dataTable value="#{vManager.FStations}" var="row">

这在JavaBeans Specification的第8.8章中有规定:

8.8 推断名称的大写。

...

因此,当我们从现有 Java 名称的中间提取属性或事件名称时,我们 通常将第一个字符转换为小写。然而,为了支持偶尔使用所有大写名称,我们会检查名称的前两个字符是否都是大写的,如果是,则不管它。比如,

  • “FooBah”变成“fooBah”
  • “Z”变成“z”
  • “网址”变为“网址”

我们提供了一个方法Introspector.decapitalize来实现这个转换规则。

请注意,属性名称是根据 getter 方法名称定义/解析的,而不是私有字段名称。


与具体问题无关,但我强烈建议不要使用这样的缩写属性名称。您的代码是这种方式不是自我记录的。不要偷懒,把字写完整:

<h:dataTable value="#{visitorManager.fireStations}" var="fireStation">

或者也许:

<h:dataTable value="#{visitor.fireStations}" var="fireStation">

【讨论】:

    猜你喜欢
    • 2012-06-30
    • 2012-07-31
    • 1970-01-01
    • 2013-12-23
    • 2016-06-22
    • 2011-07-10
    • 1970-01-01
    • 2013-07-27
    • 2016-07-09
    相关资源
    最近更新 更多