如果我想在JSF 2.0中创建多个托管bean实例,在同一范围内使用不同的名称,我该如何处理?理想情况下,我希望等效于(例如):
@ManagedBeans({name="myManagedBean1",name="myManagedBean2"})
@RequestScoped
public class MyManagedBean {
}
谢谢..
答案 0 :(得分: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类。然而,我还没有看到它是如何有用的。
答案 1 :(得分:3)
在您的情况下,您应该使用faces-config.xml。在没有ManagedBean和RequestScope批注的情况下实现bean。因此,默认情况下,您的bean不会成为托管bean。您可以根据需要使用不同的名称,不同的范围和不同的属性来实例尽可能多的managedBeans。 例如:
<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>
不要认为描述符是邪恶的,注释是实现代码的唯一方法。
答案 2 :(得分:3)
一种可能性是使您的类抽象并将其子类化为您需要的任意数量的命名实例,您可以将其留空。这也将帮助您分离未来的托管bean功能,这实际上只涉及其中一种情况。
令人遗憾的是,你必须将@ManagedBean(和范围)注释移动到所有子类,即使它是@Inherited。对于目前版本的Mojarra至少,其他人我不知道。