Какой правильный способ создания нескольких экземпляров управляемых bean-компонентов в JSF 2.0 - PullRequest
7 голосов
/ 14 сентября 2010

Если я хочу создать более одного экземпляра управляемого компонента в JSF 2.0 под разными именами в одной и той же области действия, как мне поступить? В идеале, я хочу, чтобы эквивалентная часть (например):

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

}

Спасибо ..

Ответы [ 3 ]

11 голосов
/ 14 сентября 2010

Вы не можете. Технически это тоже не имеет особого смысла. Возможно, вы ищете решение в неправильном направлении для конкретного функционального требования.

Лучше всего, чтобы у вас был родительский бин и эти "множественные бобы" были детьми.

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

, чтобы вы могли получить к нему доступ #{parent.child1} и #{parent.child2}. Конечно, вы также можете использовать свойство List<Child> или даже Map<String, Child>, чтобы быть более гибким.

Однако с помощью faces-config.xml можно определить несколько классов бинов с другим именем. Тем не менее, я не понимаю, как это полезно.

3 голосов
/ 14 декабря 2012

Одна из возможностей - сделать ваш класс абстрактным и разбить его на столько именованных экземпляров, сколько вам нужно, и вы можете оставить их пустыми.Это также поможет вам разделить функциональность будущего управляемого компонента, которая действительно относится только к одному из случаев.

Вам, к сожалению, придется переместить аннотацию @ManagedBean (и scope) ко всем подклассам, даже если это @Наследуется.Для текущей версии Mojarra по крайней мере, другие, я не знаю.

3 голосов
/ 07 сентября 2012

В вашем случае вы должны использовать face-config.xml.Внедрите свой компонент без аннотаций ManagedBean и RequestScope.Таким образом, ваш бин не станет управляемым бином по умолчанию.Затем вы можете создать столько управляемых компонентов, сколько вам нужно, с разными именами, разными областями действия и, по крайней мере, различными свойствами.Например:

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

Не думайте, что дескрипторы - это зло, а аннотации - единственный способ реализовать ваш код.

...