访问JSF中的静态属性

时间:2015-03-17 15:44:02

标签: jsf el icefaces

我的一个支持bean中有一个静态的选择项列表:

private static List<SelectItem> countries = new ArrayList<SelectItem>();

使用以下getter和setter:

public static List<SelectItem> getCountries()     {
    return countries;
}

public static void setCountries(List<SelectItem> countries) {
    LoadSelectItemsBean.countries = countries;
}

我无法通过我的XHTML页面访问静态列表。我试过的代码如下:

<ace:simpleSelectOneMenu id="countryField"
   value="#{generalCarrierDataViewBean.carrierBean.countryId}">
   <f:selectItems value="#{loadSelectItemsBean.countries}" />
   <ace:ajax />
</ace:simpleSelectOneMenu>

问题在于:

 <f:selectItems value="#{loadSelectItemsBean.countries}" />

结果的例外是:

javax.el.PropertyNotFoundException: /pages/GeneralCarrierData.xhtml @394,64 value="#{loadSelectItemsBean.states}": Property 'states' not found on type com.oag.reference.util.LoadSelectItemsBean

有人可以建议如何从支持bean正确引用静态属性吗?

由于

2 个答案:

答案 0 :(得分:13)

属性根据定义而不是static。因此,getter和setter可以简单地不是静态的,尽管它们可以反过来引用静态变量。但外界并没有看到这一点。

您有3个选项:

  1. 从getter中删除static修饰符。整个setter是不必要的,你可以删除它。

    public List<SelectItem> getCountries()     {
        return countries;
    }
    
  2. 如果您真的坚持访问静态&#34;属性,请创建一个EL函数。 (功能)。详情可在以下答案中找到:How to create a custom EL function to invoke a static method?

  3. 将整个List<SelectItem>内容转换为enum并使用OmniFaces <o:importConstants>。详情可在以下答案中找到:How to create and use a generic bean for enums in f:selectItems?

答案 1 :(得分:0)

只需创建一个返回静态属性的非静态方法:

System.Math.Pow(2, (noteNumber - referenceNoteNumber) / 12.0) * referenceFrequency