我有一个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时,出现了以下错误: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 类的子类的所有类都不受管理。此外,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的一个实例(即每个作用域)。
您需要BaseBean
是一个受管理的bean吗?由于您将其命名为BaseBean
,因此我假设该bean与所有其他受管bean具有通用性。如果是这样,那么它不应该包含@ManagedBean
注释。这样做
public abstract BaseBean{
//...
}
然后在你的管理bean
@ManagedBean
@RequestScoped
public class FooBean extends BaseBean{
//...
}