JSF 2.0托管bean的属性未找到。

5

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

vManager是我的托管bean:


search.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 文件。 - Narayan Subedi
根据错误信息,bean 已正确配置,因此 faces-config 是无关紧要的。 - BalusC
为了避免混淆,您可以直接使用getter名称,例如abc.getName()。 - aibotnet
1个回答

9

如果一个属性名称以两个或多个大写字符开头,那么它将被认为是完全按照该大小写书写。getter getFStations() 表示一个名为FStations的属性名称,因此您应该按照这样的方式访问它:

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

这在JavaBeans规范第8.8章中有明确规定:

8.8 指示名称的大小写。

...

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

  • “FooBah”变为“fooBah”
  • “Z”变为“z”
  • “URL”变为“URL”

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

请注意,属性名称基于getter方法名称而非私有字段名称确定/解析。


与具体问题无关,但我强烈建议不要缩写属性名称。这种方式使您的代码不易自描述。不要偷懒,全部用单词书写:

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

或者也许:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接