【发布时间】:2015-07-29 03:33:06
【问题描述】:
我正在尝试在 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");
}
}
请求范围的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
我错过了什么?
【问题讨论】:
-
你从哪个包导入
@ApplicationScoped? -
您是否在
faces-config.xml中以不同的名称重新注册了同一个bean? -
是的,我做到了,它是会话范围而不是请求。它甚至必须在 faces-config 中吗?
-
摆脱它。这就是注册 bean 的 JSF 1.x 风格。只需坚持注释即可。
标签: jsf jsf-2 managed-bean