Jsf @ManagedBean(name=";foo";)在EL{foo}中的名称不可用

Jsf @ManagedBean(name=";foo";)在EL{foo}中的名称不可用,jsf,jsf-2,managed-bean,Jsf,Jsf 2,Managed Bean,我试图在JSF2中使用应用程序范围的bean,但由于某种原因,在我的请求范围bean中它总是null。以下是我使用的代码: 应用程序范围的bean: @ManagedBean(eager=true, name="applicationTracking") @ApplicationScoped public class ApplicationTracking implements Serializable { private static final long serialVersionU

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

应用程序范围的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");
    }
}
@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);
    }
}
请求作用域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");
    }
}
@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
条目。这是JSF1.x风格的注册托管bean。在JSF2.x中不需要它。如果仍然这样做,那么它将覆盖托管bean类上任何基于注释的注册,导致它们无效


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

您从哪个包导入了
@ApplicationScoped
?您是否在
faces config.xml
中以不同的名称重新注册了相同的bean?是的,我注册了,它是会话范围而不是请求范围。它甚至必须在faces配置中吗?扔掉它。这是JSF1.x风格的注册bean。只需坚持注释即可。