【问题标题】:JSF 2 : Is it possible to inherit @ManagedBean?JSF 2:是否可以继承@ManagedBean?
【发布时间】:2011-07-08 16:20:21
【问题描述】:

我有一个 Bean ,带有一个 @ManagedBean 注释,定义如下:

@ManagedBean @SessionScoped public class Bean implements Serializable { /** * */ private static final long serialVersionUID = 1L; }

现在,我定义了另一个 bean:


public class FooBean extends Bean {
    // properties, methods here ...
}


当我尝试在我的 JSF 页面中引用 FooBean 时,出现以下错误:
Target Unreachable, identifier 'fooBean' resolved to null

为什么 JSF 不将 FooBean 视为托管 bean?

【问题讨论】:

标签: java jsf inheritance


【解决方案1】:

Alex 试图说明的一点是,您将类与实例混淆了。这是一个经典的(双关语)OOP 错误。

@ManagedBean 注解不适用于类本身。它适用于此类类的实例,定义了一个托管实例。

如果你的 bean 是这样定义的:

@ManagedBean
@SessionScoped
public class MyBean implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
}

那么这意味着您有一个会话范围的实例,称为 myBean(或任何您想命名的名称)。

因此,默认情况下,所有属于 MyBean class 子类的类都不受管理。此外,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 的实例(即每个范围)。

【讨论】:

【解决方案2】:

您需要BaseBean 成为托管bean 吗?既然你把它命名为BaseBean,我假设这个bean 在你所有的其他托管bean 之间具有共性。如果是这样,那么它不应该包含 @ManagedBean 注释。这样做

public abstract BaseBean{
    //...
}

然后在你的托管 bean 中

@ManagedBean
@RequestScoped
public class FooBean extends BaseBean{
    //...
}

【讨论】:

  • 通过这样做,我必须将@ManagedBean 放在我所有的bean 上......这是我想要避免的!
  • @Stephan:为什么要避免在所有托管 bean 上添加注释?我不知道你在BaseBean 中放了什么,但从你命名它的方式来看,它应该是所有托管 bean 之间的共同点,所以你不应该注释它@ManagedBean,因为它不是真正的控制器/网关你的Model。您将BaseBean 设置为SessionScoped,因此无论您是否愿意,从BaseBean 继承的每个bean 都将是SessionScoped。您不想在 Session 中保留太多东西。如果您想创建一个具有 RequestScoped 并继承 BaseBean 的托管 bean。
  • 更清楚一点:是否可以继承@ManagedBean?
猜你喜欢
  • 2014-02-13
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2011-10-03
  • 1970-01-01
相关资源
最近更新 更多