Pregunta

Me acaba de comenzar la lectura a través de Core Java Server Faces, 3ª Ed. y dicen esto (el énfasis es mío ):

  

Es un accidente histórico que hay dos mecanismos separados, frijoles CDI   y beans JSF administrados, para los granos que se pueden utilizar en las páginas JSF. Sugerimos   que utilice granos CDI a menos que su aplicación debe trabajar en un servlet sencillo   corredor como Tomcat.

¿Por qué? No proporcionan cualquier justificación. He estado usando @ManagedBean para todos los granos en un prototipo de aplicación que se ejecuta en GlassFish 3, y realmente no he notado ningún problema con esto. No me importa especialmente la migración de @ManagedBean a @Named, pero yo quiero saber por qué debería molestarse .

¿Fue útil?

Solución

CDI se prefiere sobre JSF llanura porque CDI permite la inyección de dependencia JavaEE-ancho. También puede inyectar POJOs y dejar que ellos pueden manejar. Con JSF sólo se puede inyectar un subconjunto de lo que puede con CDI.

Otros consejos

Uso CDI.

Según JSF 2.3, @ManagedBean es obsoleta . Ver también especificación tema 1417. Esto significa que no hay más de una razón para elegir @ManagedBean sobre @Named. Esto se implementó por primera vez en Mojarra 2.3.0 beta versión M06.

 introducir descripción de la imagen aquí


Historia

La diferencia principal es, @ManagedBean es administrado por marco JSF y es sólo a través de @ManagedProperty a disposición de otros granos JSF administrados. @Named es gestionado por el servidor de aplicaciones (el recipiente) a través de marco CDI y es a través de @Inject disponible para cualquier tipo de un artefacto de contenedores gestionado como @WebListener, @WebFilter, @WebServlet, @Path, @Stateless, etc e incluso un @ManagedBean JSF. Desde el otro lado de, @ManagedProperty hace trabajo no dentro de un @Named o cualquier otro recipiente artefacto administrado. Funciona realmente sólo dentro @ManagedBean.

Otra diferencia es que en realidad CDI inyecta proxies delegan a la instancia actual en el ámbito de aplicación de destino en una base de petición por / hilo (como como cómo se han inyectado EJBs). Este mecanismo permite la inyección de un bean de un alcance más limitado en un grano de un alcance más amplio, que no es posible con JSF @ManagedProperty. JSF "inyecta" aquí la instancia física directamente mediante la invocación de un regulador (que también es exactamente por qué es necesario un organismo, mientras que es no requiere con @Inject).

Si bien no directamente una desventaja - hay otras formas - el alcance de @ManagedBean se limita simplemente. Desde el otro punto de vista, si no se quiere exponer "demasiado" para @Inject, también puede simplemente mantener su habas @ManagedBean administrado. Es como protected frente public. Pero que en realidad no cuenta.

Al menos, en JSF 2.0 / 2.1, la principal desventaja de la gestión de los granos de soporte JSF por CDI es que no hay CDI equivalente de @ViewScoped. El @ConversationScoped se acerca, pero aún requiere iniciar y detener manualmente y se añade un nuevo parámetro de solicitud cid feo para las direcciones URL de resultado. MyFaces CODI hace que sea más fácil mediante puente totalmente transparente javax.faces.bean.ViewScoped de JSF para CDI por lo que sólo puede hacer @Named @ViewScoped, sin embargo, que añade un nuevo parámetro de solicitud windowId feo para las direcciones URL de resultado, también en la llanura de vainilla de navegación de página a página. OmniFaces resuelve todo esto con un verdadero CDI @ViewScoped que realmente ata el alcance del grano a la JSF estado de vista en lugar de a un parámetro de petición arbitraria.

JSF 2.2 (que se libera 3 años después de esta pregunta / respuesta) ofrece una nueva anotación CDI totalmente compatibles @ViewScoped la caja en el sabor de javax.faces.view.ViewScoped. JSF 2.2 incluso viene junto con un @FlowScoped CDI sólo que no tiene un equivalente @ManagedBean, por la presente empujando hacia los usuarios JSF CDI. La expectativa es que @ManagedBean y amigos dejará de estar disponible según Java EE 8. Si en la actualidad sigue utilizando @ManagedBean, por lo tanto, se recomienda encarecidamente a cambiar a la CDI a be preparado para futuras rutas de actualización. CDI es fácilmente disponible en Java EE Web Perfil contenedores compatibles, como JBoss, TomEE y GlassFish. Para Tomcat, hay que instalarlo por separado, tal y como ya se hizo para JSF. Ver también Como instalar CDI en Tomcat?

Con Java EE 6 y CDI tiene opción diferente para beans gestionados

  • @javax.faces.bean.ManagedBean es refiere a JSR 314 y se introdujo con JSF 2.0. El objetivo principal era evitar la configuración en el archivo faces-config.xml para usar el grano dentro de una página JSF.
  • @javax.annotation.ManagedBean(“myBean”) se define por JSR 316. Se generaliza el JSF granos para su uso en otros lugares logró en Java EE
  • @javax.inject.Named(“myBean”) son casi los mismos, como el anterior, excepto que necesita un archivo beans.xml en la web / WEB-INF carpeta para activar CDI.

Yo estaba usando CDI en GlassFish 3.0.1, sino para conseguir que funcione tuviera que importar el marco de la costura 3 (Weld). Eso funcionó bastante bien.

En GlassFish 3.1 CDI ha dejado de funcionar, y el cordón de soldadura dejó de trabajar con él. Abrí una error en este pero no lo he visto todavía fijada. Tenía que convertir todo el código para el uso de los javax.faces. * Anotaciones, pero tengo la intención de volver a CDI una vez que consigan que funcione.

Estoy de acuerdo que debe utilizar CDI, pero hay una cuestión que no he visto aún resuelto es qué hacer con la anotación @ViewScoped. Tengo una gran cantidad de código que depende de él. No está claro si @ViewScoped funciona si no está utilizando @ManagedBean con él. Si alguien puede aclarar esto lo agradecería.

Una buena razón para pasar al CDI: usted podría tener un recurso de ámbito de sesión común (perfil de usuario, por ejemplo) @Inject'ed en ambos granos JSF gestionado y servicios REST (es decir, de Jersey / JAX-RS)

Por otro lado, @ViewScoped es una razón de peso para seguir con JSF @ManagedBean - especialmente para nada con AJAX significativa. No hay sustituto para este estándar en el CDI.

Parece que puede tener algún tipo de apoyo para un @ViewScoped similar a la anotación de los granos de CDI, pero no he jugado con él personalmente.

http://seamframework.org/Seam3/FacesModule

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top