@ManagedBean(name="foo") 在 EL #{foo} 中无法通过其名称获得
@ManagedBean(name="foo") not available by its name in EL #{foo}
我试图在 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
我错过了什么?
如果您从正确的包 javax.faces.bean.*
中导入了这些注释,那么如果您在不同的 faces-config.xml
中重新注册完全相同的托管 bean class,就会发生此问题托管 bean 名称。删除那个 faces-config.xml
条目。这是注册托管 bean 的 JSF 1.x 风格。在 JSF 2.x 中不需要它。无论如何,当您这样做时,它将覆盖托管 bean class 上任何基于注解的注册,导致它们无效。
确保您在学习和使用 JSF 2.x 时没有阅读 JSF 1.x 目标资源。许多事情在 JSF 2.x.
中的处理方式不同
我试图在 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
我错过了什么?
如果您从正确的包 javax.faces.bean.*
中导入了这些注释,那么如果您在不同的 faces-config.xml
中重新注册完全相同的托管 bean class,就会发生此问题托管 bean 名称。删除那个 faces-config.xml
条目。这是注册托管 bean 的 JSF 1.x 风格。在 JSF 2.x 中不需要它。无论如何,当您这样做时,它将覆盖托管 bean class 上任何基于注解的注册,导致它们无效。
确保您在学习和使用 JSF 2.x 时没有阅读 JSF 1.x 目标资源。许多事情在 JSF 2.x.
中的处理方式不同