You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSF中<f:selectItems>无法从Bean获取值的技术求助

解决JSF <p:selectItems>使用Bean中List的问题

你现在用Maven构建带REST API和JSF的简易Web应用,在ExchangeRates这个托管Bean里写了一个获取List的方法,想把它绑定到PrimeFaces的<p:selectItems>上对吧?先看看你贴的Bean代码:

@ManagedBean(name="er", eager=true) 
public class ExchangeRates { 
    private List<String> frase = new ArrayList<>(); 

    public List<String> getFrase() { 
        frase.add("opcao1"); 
        frase.add("opcao2"); 
        return frase; 
    } 
    // 其他方法和变量...
}

这里有个很容易踩的坑——每次调用getFrase()都会往List里添加新元素!JSF的生命周期里,getter方法可能会被多次调用(比如渲染视图阶段、验证阶段等),这样你的List会越来越长,页面上的选项会重复出现,甚至导致奇怪的渲染问题。

给你几个调整建议,帮你顺利实现需求:

  • 第一步:把List初始化放到正确的位置
    别在getter方法里加元素,应该把初始化逻辑放到@PostConstruct注解的方法里,或者Bean的构造方法中。用@PostConstruct是最佳实践,因为它会在Bean实例化完成、所有依赖注入都搞定后执行:

    @ManagedBean(name="er", eager=true) 
    public class ExchangeRates { 
        private List<String> frase; 
    
        @PostConstruct
        public void init() {
            frase = new ArrayList<>();
            frase.add("opcao1");
            frase.add("opcao2");
        } 
    
        public List<String> getFrase() { 
            return frase; 
        } 
        // 记得添加selectedOption的变量和getter/setter,用来接收用户选择
        private String selectedOption;
        public String getSelectedOption() { return selectedOption; }
        public void setSelectedOption(String selectedOption) { this.selectedOption = selectedOption; }
        // 其他方法和变量...
    }
    
  • 第二步:正确在页面中绑定<p:selectItems>
    在JSF页面里,这样配置就能正常显示选项了:

    <p:selectOneMenu value="#{er.selectedOption}">
        <p:selectItems value="#{er.frase}" var="opt" itemLabel="#{opt}" itemValue="#{opt}" />
    </p:selectOneMenu>
    
  • 额外小提醒:关于eager=true
    你给Bean加了eager=true,这个属性会让Bean在应用启动时就实例化,而不是第一次被引用的时候。如果这个Bean不是全局必须提前初始化的,建议去掉这个属性,避免不必要的资源浪费哦。

内容的提问来源于stack exchange,提问作者Reactor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:16:42