2011-07-08 86 views
5

我有一個Bean,具有@ManagedBean註解,這樣定義:JSF 2:是否有可能繼承@ManagedBean?


@ManagedBean 
@SessionScoped 
public class Bean implements Serializable { 

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

} 

現在,我已經另外一個bean定義是這樣的:


public class FooBean extends Bean { 
    // properties, methods here ... 
} 


當我嘗試引用FooBean在我JSF頁面,我有以下錯誤:
Target Unreachable, identifier 'fooBean' resolved to null

爲什麼JSF不會e FooBean作爲託管bean?

回答

-1

我已經發布了這個問題的答案here內;)

4

你需要BaseBean是一個託管bean嗎?既然你把它命名爲BaseBean,我認爲這個bean在所有其他託管bean之間保持共同性。如果是的話,那麼它不應該包含@ManagedBean註釋。做到這一點

public abstract BaseBean{ 
    //... 
} 

那麼你的託管bean

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

通過這樣做,我將不得不把@ManagedBean放在我所有的bean上...這就是我想要避免的! – Stephan

+2

@Stephan:你爲什麼要避免在所有託管bean上註釋?我不知道你在'BaseBean'裏面放了什麼,但是從你命名它的方式來看,它應該在所有託管bean之間設置通用性,所以你不應該註釋它@ManagedBean,因爲它不是真正的控制器/網關你的'模型'。你的'BaseBean'是'SessionScoped',所以無論你是否需要,每一個從'BaseBean'繼承的bean都將被SessionScoped所接受。你不想在Session中保留太多東西。如果您想創建一個具有RequestScoped並繼承'BaseBean'的託管bean,該怎麼辦? –

+0

要更清楚:是否有可能繼承@ManagedBean? – Stephan

7

點亞歷克斯想說明的是,你混淆類與實例。這是一個經典(雙關語)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的實例(即每個作用域)。

+0

感謝您的明確解釋。但是,爲什麼http://docs.oracle.com/javaee/6/api/javax/faces/bean/ManagedBean.html具有@Inherited註釋? – Stephan

相關問題