簡體   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