Java JSF f:selectItems使用列表错误

Java JSF f:selectItems使用列表错误,java,jsf,Java,Jsf,Facelet代码: <h:selectOneMenu id = "country" label = "country" value = "#{beanController.countryResidence}"> <f:selectItems value = "#{countries.countries}" /> </h:selectOneMenu> @ManagedBean(eager=true, name = "countries") @Appl

Facelet代码:

<h:selectOneMenu id = "country" label = "country" value = "#{beanController.countryResidence}">
    <f:selectItems value = "#{countries.countries}" />
</h:selectOneMenu>
@ManagedBean(eager=true, name = "countries")
@ApplicationScoped
public class CountriesConstants {
        private List<SelectItem> countries;
        public CountriesConstants(){
            countries.add(new SelectItem("DE", "Germany"));
            countries.add(new SelectItem("JA", "Japan"));
            countries.add(new SelectItem("RU", "Russia"));
            countries.add(new SelectItem("US", "United States"));
        }
        public List<SelectItem> getCountries() {
            return countries;
        }
        public void setCountries(List<SelectItem> countries) {
            this.countries = countries;
        }
}
我一步一步地学习了一些教程,但我不断地发现这个错误。我尝试将列表设置为静态,并初始化静态块中的值,但得到了相同的错误

编辑:

<h:selectOneMenu id = "country" label = "country" value = "#{beanController.countryResidence}">
    <f:selectItems value = "#{countries.countries}" />
</h:selectOneMenu>
@ManagedBean(eager=true, name = "countries")
@ApplicationScoped
public class CountriesConstants {
        private List<SelectItem> countries;
        public CountriesConstants(){
            countries.add(new SelectItem("DE", "Germany"));
            countries.add(new SelectItem("JA", "Japan"));
            countries.add(new SelectItem("RU", "Russia"));
            countries.add(new SelectItem("US", "United States"));
        }
        public List<SelectItem> getCountries() {
            return countries;
        }
        public void setCountries(List<SelectItem> countries) {
            this.countries = countries;
        }
}
新的Bean代码

@ManagedBean(eager=true, name="constants")
@ApplicationScoped
public class Constants {

    public static final String VALIDATE_DETAILED = "detailed";
    public static final List<SelectItem> countries;

    static{
        countries = new ArrayList<SelectItem>();
        countries.add(new SelectItem("DE", "Germany"));
        countries.add(new SelectItem("JA", "Japan"));
        countries.add(new SelectItem("RU", "Russia"));
        countries.add(new SelectItem("US", "United States"));
    }

    public List<SelectItem> getCountries() {
        return countries;
    }
}
@ManagedBean(eager=true,name=“constants”)
@适用范围
公共类常量{
公共静态最终字符串验证\u DETAILED=“DETAILED”;
公开静态最终名单国家;
静止的{
国家/地区=新阵列列表();
添加(新选择项(“DE”、“德国”);
添加(新选择项(“JA”、“日本”);
添加(新选择项(“俄罗斯”、“俄罗斯”);
添加(新选择项(“美国”、“美国”);
}
国家/地区公共列表(){
返回国;
}
}

这似乎是可行的,但我觉得奇怪的是,我可以使用非静态方法访问静态属性。如果删除getCOuntries()方法,则会抛出一个错误,指出不存在任何countries属性。

在bean构造函数中,必须先创建列表,然后尝试以下操作:

public CountriesConstants(){
   countries = new LinkedList<SelectItem>();
   countries.add(new SelectItem("DE", "Germany"));
   countries.add(new SelectItem("JA", "Japan"));
   countries.add(new SelectItem("RU", "Russia"));
   countries.add(new SelectItem("US", "United States"));
}

在bean构造函数中,必须首先创建列表,请尝试以下操作:

public CountriesConstants(){
   countries = new LinkedList<SelectItem>();
   countries.add(new SelectItem("DE", "Germany"));
   countries.add(new SelectItem("JA", "Japan"));
   countries.add(new SelectItem("RU", "Russia"));
   countries.add(new SelectItem("US", "United States"));
}

首先初始化arrayList

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

您的facelets代码似乎很好

首先初始化arrayList

private List<SelectItem> countries = new ArrayList<SelectItem>();
private final List<SelectItem> countries = new ArrayList<SelectItem>();
private List countries=new ArrayList();
您的facelets代码似乎很好

私有最终列表国家/地区=新ArrayList();
private final List<SelectItem> countries = new ArrayList<SelectItem>();
如果要使countries对象不再实例化,请初始化列表并将其声明为“final”。使用final是一种很好的做法,它还可以提高代码的可读性。

private final List countries=new ArrayList();

如果要使countries对象不再实例化,请初始化列表并将其声明为“final”。使用final是一种很好的做法,它还可以提高代码的可读性。

hmmmm您确定这是必要的吗?由于这个bean有
@ApplicationScoped
,只要没有其他调用重新初始化这个列表,我认为它在应用程序的整个生命周期都会保持不变。当然,这不是必需的,但我会为它分配一个不可变的列表。如果它也是最终的,那么对于那些阅读代码的人来说,这是一个额外的保证和意向声明。你确定这是必要的吗?由于这个bean有
@ApplicationScoped
,只要没有其他调用重新初始化这个列表,我认为它在应用程序的整个生命周期都会保持不变。当然,这不是必需的,但我会为它分配一个不可变的列表。如果它也是最终的,那么对于那些阅读代码的人来说,这是一个额外的保证和意向声明。如果国家/地区列表已经包含SelectItem实例,为什么我要指定itemLabel和itemValue呢?它似乎在没有任何其他属性的情况下工作得很好。我也检查了源代码,结果是理想的。谢谢我试图实现相同的结果,但使用了静态块。这对我来说是一个更好的解决方案,因为我的项目架构。可以这样做吗?嗯,我不知道你说的静态块是什么意思?
静态
只意味着你的
国家
变量在你的ManagedBean
常量的所有实例中共享。当然,您可以使用非静态函数将其导出。尽管建议您使用静态函数来访问静态变量,但Java并没有任何规则强制您这样做。无论如何,由于您的ManagedBean已处理了
@ApplicationScoped
,因此在任何给定时间只有一个ManagedBean实例。因此,使用
static
声明它不会产生任何有意义的结果。您应该将其保存在私人列表国家中如果国家/地区列表已经包含SelectItem实例,为什么我要指定itemLabel和itemValue?没有任何其他属性,它似乎可以正常工作。我也检查了源代码,结果是理想的。谢谢我试图实现相同的结果,但使用了静态块。这对我来说是一个更好的解决方案,因为我的项目架构。可以这样做吗?嗯,我不知道你说的静态块是什么意思?
静态
只意味着你的
国家
变量在你的ManagedBean
常量的所有实例中共享。当然,您可以使用非静态函数将其导出。尽管建议您使用静态函数来访问静态变量,但Java并没有任何规则强制您这样做。无论如何,由于您的ManagedBean已处理了
@ApplicationScoped
,因此在任何给定时间只有一个ManagedBean实例。因此,使用
static
声明它不会产生任何有意义的结果。您应该将其保存在私人列表国家中获取异常时,始终查看堆栈跟踪的最底部部分。您有一个
NullPointerException
,这是一个非常自我解释的异常。当获取异常时,请始终查看堆栈跟踪的最底部。您有一个
NullPointerException
,这是非常自我解释的。