java - JSF 2 : Is it possible to inherit @ManagedBean?

标签 java jsf inheritance

我有一个 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/

相关文章:

java - 更好 <h :selectManyCheckbox> layout?

AngularJS 表达式在带有 JSF 的 ng-src 中无法正常工作

jsf - 为什么 JSF 保存组件树状态?

java - 有类似 while 开关之类的东西吗?

java - 无法使用搜索工具在 liferay portlet 中搜索期刊文章

java - 当抽象类在 Java 中实现接口(interface)时会发生什么

java - 使用继承和多态来解决一个常见的游戏问题

java - 重写父类(super class)的方法。不明确的引用编译时错误

java - 运行时在面板上绘制

java - 使用代码输入数据进行反向传播