繁体   English   中英

JSF 2:是否可以继承@ManagedBean?

[英]JSF 2 : Is it possible to inherit @ManagedBean?

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


@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?

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

@ManagedBean 注释本身不适用于类。 它适用于此类类的实例,定义一个受管理的实例。

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

@ManagedBean
@SessionScoped
public class MyBean implements Serializable {

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

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

因此,默认情况下不管理作为 MyBean class子类的所有类。 此外,JSF 如何识别您在哪里使用子类? 如果是这样,你给这些实例起什么名字? (因为你必须给它们起个名字,否则,JSF 将如何管理它们?)

所以,假设你有另一个 class:

Class MyOtherClass {
    private MyBean myBeanObject; // myBeanObject isn't managed. 
}

@PostConstruct 和您使用的所有其他注释会发生什么? 没有什么。 如果您创建了 MyBean 的实例,那么管理它的是您,而不是 JavaServerFaces。 所以它并不是真正的托管 bean,只是您使用的常见 object。

但是,当您这样做时,情况会完全改变:

@ManagedBean
@SessionScoped
Class MyOtherClassBean {
    @ManagedProperty("#{myBean}")
    private MyBean myBeanObject;

    public void setMyBeanObject(...) { ... }
    public MyBeanClass getMyBeanObject() { ... }
}

再说一次,管理的不是 class,而是 class 的实例 拥有一个 ManagedBean 意味着您只有一个该 bean 的实例(即按照 scope)。

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

public abstract BaseBean{
    //...
}

然后在您的托管 bean 中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM