2010-09-14 55 views
6

如果我想在JSF 2.0中創建多個託管bean實例,在同一範圍內的不同名稱下,我該如何繼續?理想情況下,我想equivilant到(例如):在JSF 2.0中創建託管bean的多個實例的正確方法是什麼

@ManagedBeans({name="myManagedBean1",name="myManagedBean2"}) 
@RequestScoped 
public class MyManagedBean { 

} 

謝謝..

+0

我認爲JSF 2.0註釋應該和faces-config.xml一樣強大,它與bean的創建有關。我一直在JSF 1.2中使用同一類的多個bean,但遺憾的是JSF2.0並沒有通過註釋來克服這個特性。 – Puche 2011-03-29 07:41:02

回答

10

你不能。這在技術上也沒有多大意義。您可能正在尋找針對特定功能需求的錯誤方向的解決方案。

你最好打賭是有一個父母的豆,並有那些「多個豆」作爲孩子。

@ManagedBean 
@RequestScoped 
public class Parent { 
    private Child child1; 
    private Child child2; 
    // ... 
} 

,這樣就可以通過#{parent.child1}#{parent.child2}訪問它。您當然也可以使用List<Child>屬性,或者甚至使用Map<String, Child>來更靈活。

faces-config.xml但是可以定義多個不同名稱的bean類。不過,我不明白這有什麼用處。

+0

謝謝。這個需求來自所討論的託管bean,它們爲自定義組件支持bean,這些自定義組件在頁面上有一些綁定到UIComponents的字段。因此(罕見的情況下),我需要多個相同類型的支持bean的多個實例,用於多個相同的組件,在這種情況下是UI對話框。我認爲你的解決方案可能是這種情況,但這會導致無法使用@PostConstruct等生命週期註釋。謝謝! – Dave 2010-09-14 16:25:37

+0

您**可以**創建ManagedBean的多個實例(覆蓋ManagedBeanELResolver的* getValue *)。他們將使用相同的BeanBuilder和BeanManager進行構建,他們只是在beanName上有所不同。如果您的解決方案有必要,我不知道。在一些罕見的情況下,我會說是的。 – Manuel 2012-10-18 20:01:02

+0

@手冊:當然有可能。主要答案僅適用於使用JSF 2.0註釋來完成目標,完全如OP所述。請注意,答案的最後一段指出,在使用舊的「faces-config.xml」方式時可以定義多個實例。爲此,您不需要破解JSF impl特定的類。 – BalusC 2012-10-18 20:06:27

3

在你的情況下,你應該使用faces-config.xml。在沒有ManagedBean和RequestScope註釋的情況下實現您的bean。所以你的bean不會成爲默認的託管bean。您可以根據需要使用不同的名稱,不同的範圍和至少不同的屬性來實例化儘可能多的managedBean。 例如:

<managed-bean> 
    <managed-bean-name>MyManagedBean1</managed-bean-name> 
    <managed-bean-class>org.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
    <managed-property> 
     <property-name>value1</property-name> 
     <property-class>int</property-class> 
     <value>5</value> 
    </managed-property> 
    <managed-property> 
     <property-name>value2</property-name> 
     <property-class>int</property-class> 
     <value>2</value> 
    </managed-property> 
</managed-bean> 

<managed-bean> 
    <managed-bean-name>MyManagedBean2</managed-bean-name> 
    <managed-bean-class>org.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>view</managed-bean-scope> 
    <managed-property> 
     <property-name>value1</property-name> 
     <property-class>int</property-class> 
     <value>30</value> 
    </managed-property> 
    <managed-property> 
     <property-name>value2</property-name> 
     <property-class>java.lang.String</property-class> 
     <value>project</value> 
    </managed-property> 
</managed-bean> 

不要以爲描述符是邪惡和註解來實現你的代碼的唯一途徑。

3

一種可能性是讓您的類抽象並將其子類化爲儘可能多的命名實例,您可以將其留空。這也可以幫助你分離未來的託管bean功能,這些功能實際上只涉及其中一種情況。

您將不得不將@ManagedBean(和範圍)註釋移動到所有的子類,遺憾的是,即使它是@Inherited。對於目前版本的Mojarra atleast,其他人我不知道。

+0

對於我上面的用例,我決定採用這種方法,因爲每個不同的網頁都有不同的初始情況,例如。謝謝。 – user3586195 2015-11-16 17:50:09

相關問題