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



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

相关内容

  • 没有找到相关文章

最新更新