2010-09-14 15 views
6

Si deseo crear más de una instancia de beans administrados en JSF 2.0, con diferentes nombres en el mismo ámbito, ¿cómo debo proceder? Idealmente, quiero que el equivilant a (por ejemplo):¿Cuál es la forma correcta de crear varias instancias de beans administrados en JSF 2.0

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

} 

Gracias ..

+0

Creo que las anotaciones JSF 2.0 deben ser tan potentes como faces-config.xml ya está relacionado con la creación de bean. He estado usando varios beans de la misma clase en JSF 1.2 y es una pena que JSF2.0 no supere esta característica con anotaciones. – Puche

Respuesta

10

No se puede. Técnicamente tampoco tiene mucho sentido. Probablemente esté buscando una solución en la dirección incorrecta para el requisito funcional particular.

Su mejor opción es tener un grano de avena y tener esos "frijoles múltiples" cuando sean niños.

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

para que pueda acceder a ella por #{parent.child1} y #{parent.child2}. Por supuesto, también puede usar una propiedad List<Child> o incluso Map<String, Child> para ser más flexible.

Con el faces-config.xml es posible definir varias clases de bean con un nombre diferente. Aún así, no veo cómo eso es útil.

+0

Gracias. El requisito proviene de los beans administrados en cuestión que respaldan beans para componentes personalizados, que tienen algunos campos vinculados a UIComponents en la página. Por lo tanto (albiet en raras ocasiones), necesito múltiples instancias del mismo tipo de bean de respaldo para varios de los mismos componentes, en este caso los diálogos de IU. Pensé que tu solución podría ser el caso, pero esto deja a uno incapaz de usar anotaciones del ciclo de vida como @PostConstruct. ¡Gracias! – Dave

+0

** Puedes ** crear múltiples instancias de un ManagedBean (anular ManagedBeanELResolver * getValue *). Se construirán usando el mismo BeanBuilder y BeanManager, solo difieren en su beanName. Si es necesario para su solución, no lo sé. En algunos casos raros, diría que sí. – Manuel

+0

@Manual: seguramente es posible. La respuesta principal solo se aplica al uso de anotaciones JSF 2.0 para lograr el objetivo, exactamente como lo hizo el OP. Tenga en cuenta que el último párrafo de la respuesta indica que, en su lugar, es posible definir varias instancias cuando se utiliza el antiguo método 'faces-config.xml'. Para eso, no es necesario hackear las clases específicas impl de JSF. – BalusC

3

En su caso, debe hacer uso de faces-config.xml. Implique su bean sin la anotación ManagedBean y RequestScope. Por lo tanto, su bean no se convertirá en un bean administrado por defecto. Puede, por ejemplo, administrar todos los Beans gestionados que necesite con diferentes nombres, diferentes ámbitos y al menos diferentes propiedades. Por ejemplo:

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

No piense que los descriptores son malas y las anotaciones son la única manera de poner en práctica su código.

3

Una posibilidad es hacer que su clase sea abstracta y la subclases en tantas instancias con nombre como necesite, que puede dejar en blanco. Esto también lo ayudará a separar futuras funcionalidades administradas de beans que realmente solo conciernen a uno de los casos.

Tendrá que mover la anotación @ManagedBean (y el alcance) a todas las subclases, lamentablemente, aunque sea @ Heredado. Para la versión actual de Mojarra al menos, otros no lo sé.

+0

Para mi caso de uso anterior, decidí seguir este enfoque ya que hay diferentes casos de inicio para cada página web diferente, como. Gracias. – user3586195

Cuestiones relacionadas