gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:09:08 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com