我有一个 Bean
,有一个 @ManagedBean注释,定义如下:
@ManagedBean
@SessionScoped
public class Bean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
}
Now, I have another bean defined like this :
public class FooBean extends Bean {
// properties, methods here ...
}
当我尝试在我的 JSF 页面中引用 FooBean 时,出现以下错误:
目标无法到达,标识符“fooBean”解析为 null
为什么 JSF 没有将 FooBean
视为托管 bean?
最佳答案
Alex 试图表达的观点是您将类与实例混淆了。这是一个典型的(双关语)OOP 错误。
@ManagedBean 注释本身不适用于类。它适用于此类的实例,定义一个被管理的实例。
如果你的 bean 是这样定义的:
@ManagedBean
@SessionScoped
public class MyBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
}
那么这意味着您有一个 session 范围的实例,称为 myBean(或任何您想要命名的名称)。
因此,所有作为 MyBean 类 子类的类在默认情况下都不受管理。此外,JSF 如何识别您在哪里使用子类?如果是这样,你给这些实例起什么名字? (因为你必须给它们起个名字,否则,JSF 将如何管理它们?)
那么,假设你有另一个类:
Class MyOtherClass {
private MyBean myBeanObject; // myBeanObject isn't managed.
}
@PostConstruct 和您使用的所有其他注释发生了什么?没有什么。如果您创建了 MyBean 的实例,那么管理它的就是您,而不是 JavaServerFaces。所以它并不是真正的托管 bean,只是您使用的一个普通对象。
但是,当您这样做时,情况就完全不同了:
@ManagedBean
@SessionScoped
Class MyOtherClassBean {
@ManagedProperty("#{myBean}")
private MyBean myBeanObject;
public void setMyBeanObject(...) { ... }
public MyBeanClass getMyBeanObject() { ... }
}
话说回来,管理的不是类,而是类的实例。拥有一个 ManagedBean 意味着您只有该 bean 的一个实例(即每个范围)。
关于java - JSF 2 : Is it possible to inherit @ManagedBean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6627384/