Spring JSF integración: cómo inyectar un Resorte componente/servicio en JSF managed bean?

Entiendo que un bean gestionado funciona como un controlador, debido a que su única tarea es la de «enlace» de la Capa de la Vista con el Modelo.

Utilizar un bean como un bean gestionado debo declarar @ManagedBeananotación, haciendo que me pueda comunicar JSF con frijol directamente.

Si quiero inyectar un poco de componente (a partir de la Primavera) en este managedBean tengo dos posibles maneras:

  1. Elija la propiedad en ManagedBean (como «BasicDAO dao») y declarar @ManagedProperty(#{"basicDAO"}) por encima de la propiedad. Hacerlo, me estoy inyectando el frijol "basicDAO" a partir de la Primavera en el ManagedBean.
  2. Declarado @Controlador en ManagedBean Clase, entonces voy a tener @ManagedBean y @Controller anotaciones, todos juntos. Y en propiedad "BasicDAO dao" debo utilizar @Autowired a partir de la Primavera.

Es mi entendimiento correcto?

OriginalEl autor RonaldoLanhellas | 2013-08-22

3 Kommentare

  1. 5

    Hay otra forma de utilizar la Primavera-managed beans en JSF managed beans simplemente ampliando su JSF bean de SpringBeanAutowiringSupport y la Primavera se encargará de la inyección de dependencia.

    @ManagedBean //JSF-managed.
    @ViewScoped //JSF-managed scope.
    public class GoodBean extends SpringBeanAutowiringSupport {
    
        @Autowired
        private SpringBeanClass springBeanName; //No setter required.
    
        //springBeanName is now available.
    }
    Es usted la misma persona que inicialmente hizo la pregunta? El uso de @ManagedBean anotaciones es OBSOLETO en JSF, como son el JSF define los ámbitos. Todo va a ser CDI y desde la Primavera de una especie de «sabe» acerca de estos cdi anotaciones demasiado (si leí todo correctamente), pasando por estos «nuevos» CDI anotaciones es el mejor enfoque. No hay necesidad de extender clases etc.. estoy casi inclinado a downvote pero se lo dejo a los expertos reales)
    @ManagedBean es en DESUSO en JSF. Pero como se puede ver mencionas @ManagedBean en la pregunta, y de nuevo como se puede ver «54 upvoted respuesta» se menciona acerca de @ManagedBean así. Y de nuevo como se puede ver, empecé mi respuesta diciendo que «Hay otra forma». Honestamente, no pensé que mi respuesta sería la aceptación de uno en lugar de @BalusC excelente respuesta. Yo sólo quería mostrar otro camino más fácil. No entiendo cómo podría yo merezco esos «estoy casi inclinado a downvote» palabras 🙂 «la misma persona que hizo la pregunta?» lol, no 😀 ¿alguna vez has intentado esto antes? 🙂
    La razón de que me dijo ‘casi inclinado a downvote’ fue debido a que fue dependiente de usted la misma persona como el OP con una cuenta diferente. Si no, no voy a downvote. Nunca los menos, sus comentarios sobre la otra pregunta también hablando de @ManagedBean son de no válido. Que fue de 4 años, no ahora. Si el OP ha cambiado solo la aceptan respuesta después de todos estos años, creo, en serio, no la esperanza de que él va a cambiar todo su código ;-). Caso cerrado… Saludos!!!

    OriginalEl autor tylerdurden

  2. 72

    @ManagedBean vs @Controller

    Primero de todos, usted debe elegir uno un marco para gestionar su frijoles. Usted debe elegir cualquiera de los JSF y Spring (o CDI) para gestionar sus frijoles. Mientras que los siguientes trabajos, es un error fundamental:

    @ManagedBean //JSF-managed.
    @Controller //Spring-managed.
    public class BadBean {}

    Usted termina con dos completamente independiente de las instancias de la misma managed bean de la clase, gestionado por JSF y otro gestionado por la Primavera. No directamente, claro que a uno le en realidad ser utilizado en EL cuando se hace referencia a ella como #{someBean}. Si usted tiene el SpringBeanFacesELResolver registrado en faces-config.xml, entonces sería la de Primavera-administrado, no el JSF-administrado. Si usted no tiene eso, entonces sería el JSF-administrado.

    También, cuando se declara una JSF managed bean ámbito específico de aplicación, tales como @RequestScoped, @ViewScoped, @SessionScoped o @ApplicationScoped de javax.faces.* paquete, sólo será reconocido y utilizado por @ManagedBean. No va a ser entendido por @Controller como se espera que sus propios @Scope anotación. Este defecto singleton (ámbito de aplicación) cuando se ausente.

    @ManagedBean //JSF-managed.
    @ViewScoped //JSF-managed scope.
    @Controller //Spring-managed (without own scope, so actually becomes a singleton).
    public class BadBean {}

    Cuando se hace referencia a la anterior bean a través de #{someBean}, volvería la Primavera gestionado en el ámbito de la aplicación de frijol, no el JSF-vista administrado ámbito de frijol.


    @ManagedProperty vs @Autowired

    El JSF específicos @ManagedProperty sólo funciona en JSF managed beans, es decir, cuando usted está utilizando @ManagedBean. La Primavera específicos @Autowired sólo funciona en la Primavera-managed beans, es decir, cuando usted está utilizando @Controller. A continuación los enfoques son más o menos equivalentes y no puede ser mixto:

    @ManagedBean //JSF-managed.
    @RequestScoped //JSF-managed scope.
    public class GoodBean {
    
        @ManagedProperty("#{springBeanName}")
        private SpringBeanClass springBeanName; //Setter required.
    }
    @Component //Spring-managed.
    @Scope("request") //Spring-managed scope.
    public class GoodBean {
    
        @Autowired
        private SpringBeanClass springBeanName; //No setter required.
    }

    Tenga en cuenta que cuando usted tiene el SpringBeanFacesELResolver registrado en faces-config.xml como por la javadoc,

    <application>
        ...
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>

    y por lo tanto puede hacer referencia a la Primavera managed beans en EL a través de #{springBeanName}, a continuación, puede hacer referencia a ellos en @ManagedProperty demasiado, ya que, básicamente, establece que el evaluado resultado de la expresión EL. A la inversa, la inyección de una JSF managed bean a través de @Autowired, es de forma no compatible. Sin embargo, puede utilizar @Autowired en una JSF managed bean al registrar manualmente el JSF managed bean instancia en la Primavera de autowirable contexto como el de abajo. Véase también Cómo integrar JSF 2 y la Primavera 3 (o la Primavera 4) muy bien para el truco.

    @ManagedBean //JSF-managed.
    @ViewScoped //JSF-managed scope.
    public class GoodBean implements Serializable {
    
        @Autowired
        private SpringBeanClass springBeanName; //No setter required.
    
        @PostConstruct
        private void init() {
            FacesContextUtils
                .getRequiredWebApplicationContext(FacesContext.getCurrentInstance())
                .getAutowireCapableBeanFactory().autowireBean(this);
    
            //springBeanName is now available.
        }
    }

    @XxxScoped vs @Scope

    De la primavera @Scope tiene soporte limitado para JSF ámbitos. No hay ningún equivalente para JSF del @ViewScoped. Te gustaría básicamente cualquiera homegrow sus propios ámbitos, o un palo manualmente el registro de la JSF managed bean instancia en la Primavera de autowirable contexto como se muestra arriba.

    Y, desde el otro lado, Spring WebFlow fue tomada en JSF 2.2 a través de las nuevas @FlowScoped anotación. Así que si usted sucede estar en el JSF 2.2 ya, entonces usted no necesariamente necesita usar Spring WebFlow si usted solamente desea que el flujo alcance.


    CDI – tratando de unificar todo

    Desde Java EE 6, CDI se ofrece como alternativa estándar para la Primavera DI. Se ha respectivamente @Named y @Inject anotaciones para esto, y también su propio conjunto de ámbitos. No estoy seguro de cómo interactúa con la Primavera como yo no uso la Primavera, pero @Inject funciona dentro de una @ManagedBean, y @ManagedProperty dentro de un @ManagedBean puede hacer referencia a una @Named bean. Por otro lado, @ManagedProperty no funciona dentro de un @Named bean.

    El propósito de la CDI es la unificación de los diferentes bean marcos de gestión en sólo uno o especificación de la interfaz. La primavera podría haber sido una completa implementación de la iniciativa, pero se eligió implementar parcialmente (sólo JSR-330 javax.inject.* es compatible, pero JSR-299 javax.enterprise.context.* no). Véase también Será la Primavera de apoyo de CDI? y este tutorial.

    JSF va a trasladar a la CDI para el bean de gestión y desaprobar @ManagedBean y amigos en una versión futura.

    Véase también:

    Usted dijo: «JSF específicos @ ManagedProperty sólo funciona en JSF managed beans, es decir, cuando usted está usando @ ManagedBean». Pero estoy con @ ManagedProperty referencia a un Resorte de Frijol y esto funciona bien. Cómo me dijo: estoy con @ ManagedProperty(#{‘basicDAO’}) y bean ‘basicDAO’ es un @ Repositorio de frijol.
    ManagedProperty es el enfoque(que me he topado) para integrar la primavera con jsf(inyectar bean). lo que yo creo(corrígeme si estoy equivocado) org.springframework.web.jsf.el.SpringBeanFacesELResolver propaga jsf bean para la Primavera de Frijol. Y, en General creamos Primavera contenedor(org.springframework.web.contexto.ContextLoaderListener), que constituye jsf. Y como @BalusC dijo que a partir de ahora la Primavera no soporta Java EE 6 CDI. Yo quería entrañablemente @ ConversationalScope que no es compatible con la primavera recipiente con JSF.
    Así, ManagedProperty es como @Autowired, pero en JSF. 😀
    Un 54 upvoted respuesta reemplazado como la aceptación de uno por uno nuevo que se refiere a la obsoleta anotaciones… Wow…

    OriginalEl autor BalusC

  3. 1

    La manera fácil de hacer esto es a través de XML. He utilizado @Component de hecho ya jsf managed bean pero @Autowired no funcionó porque bean gestionado ya estaba allí, en faces-config.xml. Si es obligatorio para mantener que bean gestionado definición, junto con su propiedad administrada en el archivo xml, a continuación, se sugiere agregar la primavera bean como otra propiedad administrada dentro de los managed bean etiqueta. Aquí la primavera de frijol se haya definido en spring-config.xml(puede ser autowired en algún lugar de forma alterna). por favor consulte
    https://stackoverflow.com/a/19904591/5620851

    editado por mí. Sugiero que implementar por completo a través de la anotación @Administrado y @Componente o a través de xml para ambos.

    OriginalEl autor hi.nitish

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea