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

Wildfly26迁移至28后ViewScoped Bean因includeViewParams多次初始化

问题分析与解决方案

核心问题根源

你的代码存在一个关键错误:PageTwo的<f:metadata>直接绑定了PageOne的ViewScoped Bean属性。在Wildfly 28(对应Jakarta EE 10 / JSF 4.0)中,CDI和JSF的生命周期处理更严格:当PageOne页面渲染<h:link includeViewParams="true"时,JSF会预解析目标页面(PageTwo)的view参数配置,此时会触发PageOne Bean的额外实例化;同时PageOne自身的view参数处理也会触发一次实例化,最终导致多次初始化。而Wildfly 26(Jakarta EE 9 / JSF 3.0)的JSF实现对这种跨页面引用ViewScoped Bean的行为约束较弱,所以没有暴露问题。

即使使用OmniFaces的@ViewScoped,如果跨页面引用ViewScoped Bean的逻辑不修正,问题依然会存在——因为ViewScoped Bean的生命周期本就绑定到单个视图,跨页面引用本身就是不符合设计规范的用法。

修复步骤

  1. 为PageTwo创建独立的ViewScoped Bean
    每个视图应该对应自己的ViewScoped Bean,不要复用其他页面的Bean接收view参数。创建PageTwo.java:

    package mypackage;
    
    import java.io.Serializable;
    import jakarta.annotation.PostConstruct;
    import jakarta.faces.view.ViewScoped;
    import jakarta.inject.Named;
    
    @Named
    @ViewScoped
    public class PageTwo implements Serializable {
        private static final long serialVersionUID = 1L;
        private String page;
        private String search;
    
        @PostConstruct
        private void init() {
            System.out.println("Page Two PostConstruct");
        }
    
        // getter和setter方法
        public String getPage() { return page; }
        public void setPage(String page) { this.page = page; }
        public String getSearch() { return search; }
        public void setSearch(String search) { this.search = search; }
    }
    
  2. 修正PageTwo的XHTML配置
    将<f:metadata>中的绑定改为PageTwo自己的Bean:

    <f:metadata>
        <f:viewParam name="page" value="#{pageTwo.page}" />
        <f:viewParam name="search" value="#{pageTwo.search}" />
    </f:metadata>
    
  3. 验证OmniFaces版本兼容性
    如果继续使用OmniFaces的@ViewScoped,确保使用OmniFaces 4.x版本,该版本专门适配Jakarta EE 10(Wildfly 28),低版本可能存在兼容性问题。

  4. 检查Wildfly 28的JSF配置
    确认WEB-INF/web.xml或WEB-INF/faces-config.xml中没有开启会导致额外实例化的过度调试配置,比如:

    <context-param>
        <param-name>jakarta.faces.PROJECT_STAGE</param-name>
        <param-value>Production</param-value>
    </context-param>
    

验证结果

完成上述修改后,访问PageOne时,PageOne Bean只会初始化一次;点击链接跳转到PageTwo时,PageTwo Bean也只会初始化一次,符合ViewScoped的生命周期预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:58:08