@ManagedBean(name="foo") 在 EL #{foo} 中无法按其名称使用

2023-11-30

我试图在 JSF2 中使用应用程序范围的 bean,但由于某种原因它总是null在我的请求作用域 bean 中。这是我正在使用的代码:

应用程序作用域 bean:

@ManagedBean(eager=true, name="applicationTracking")
@ApplicationScoped
public class ApplicationTracking implements Serializable {
    private static final long serialVersionUID = 4536466449079922778L;

    public ApplicationTracking() {
        System.out.println("ApplicationTracking constructed");
    }
}

请求作用域 bean:

@ManagedBean
@RequestScoped
public class SearchResults implements Serializable {    
    private static final long serialVersionUID = 4331629908101406406L;

    @ManagedProperty("#{applicationTracking}")
    private ApplicationTracking appTracking;

    public ApplicationTracking getAppTracking() {
        return appTracking;
    }

    public void setAppTracking(ApplicationTracking appTrack) {
        this.appTracking = appTrack;
    }

    @PostConstruct
    public void init() {
        System.out.println("SearchResults.init CALLED, appTracking = " + appTracking);
    }
}

根据我在论坛中看到的所有内容,这应该可以在没有任何其他配置的情况下工作。当我启动服务器(Tomcat)时,我看到ApplicationTracking构造函数和init方法被调用。

但在我的SearchResults将打印输出组成PostConstruct始终为空:

SearchResults.init CALLED, appTracking = null 

我缺少什么?


前提是您从正确的包中导入了这些注释javax.faces.bean.*,那么如果您在中重新注册了完全相同的托管bean类,就会发生这个问题faces-config.xml使用不同的托管 Bean 名称。摆脱那个faces-config.xml入口。这就是注册托管 bean 的 JSF 1.x 风格。在 JSF 2.x 中不需要它。无论如何,当您这样做时,它将覆盖托管 bean 类上任何基于注释的注册,导致它们无效。

确保您在学习和使用 JSF 2.x 时没有阅读 JSF 1.x 目标资源。 JSF 2.x 中许多事情的处理方式都不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@ManagedBean(name="foo") 在 EL #{foo} 中无法按其名称使用 的相关文章

随机推荐