El uso de JSF 2.0 y la Primavera, yo uso un @RequestScope managed bean. Este grano se almacena la información sobre el usuario que ha iniciado sesión. Carga el usuario de la DB en un @PostConstruct método:

@PostConstruct
public void init() {
    String username = login.getUsername();
    user = userDao.load(username);
}

El usuario ha iniciado sesión pueden activar en acción en la página que se actualiza el usuario en la base de datos (usando otro managed bean).

Sin embargo, la @RequestScope bean es construido a principios de la solicitud, que es antes de la llamada a la actualización de la acción. Como resultado, cuando la página se vuelve a mostrar la User variable todavía tiene sus antiguos valores.

Mi pregunta es: ¿tengo una forma de ejecutar mi método de carga no en el principio de la solicitud, pero después de la petición ha sido enviada? O me estoy tratando con esto de la manera equivocada?

Gracias por su comprensión,

Sébastien

1 Comentario

  1. 1

    El usuario ha iniciado sesión pueden activar en acción en la página que se actualiza el usuario en la base de datos (el uso de otro bean gestionado).

    La mismo bean gestionado debería haber sido actualizado en ese punto. Si usted no puede volver a usar el mismo bean gestionado por alguna razón, entonces usted debe hacer manualmente entrando en el método de acción y llamar a las incubadoras de ti mismo.


    Actualización: basado en los comentarios, he aquí cómo los granos deben ser declarados y se inyecta y se utiliza en su condición particular:

    @ManagedBean(name="#{login}")
    @SessionScoped
    public class LoginManager {
    
        private String username;
    
        //...
    }

    @ManagedBean(name="#{user}")
    @RequestScoped
    public class UserManager {
    
        @ManagedProperty(value="#{login}")
        private LoginManager login;
        private User current;
    
        @PostConstruct
        public void init() {
            current = userDAO.find(login.getUsername());
        }
    
        //...
    }

    @ManagedBean(name="#{profile}")
    @RequestScoped
    public class ProfileManager {
    
        @ManagedProperty(value="#{user}")
        private UserManager user;
    
        public void save() {
            userDAO.save(user.getCurrent());
        }
    
        //...
    }

    <h:form>
        <h:inputText value="#{user.current.firstname}" />
        <h:inputText value="#{user.current.lastname}" />
        <h:inputText value="#{user.current.birthdate}" />
        ...
        <h:commandButton value="Save" action="#{profile.save}" />
    </h:form>
    • De hecho, lo que parece ocurrir es que la Solicitud de frijol es creado, entonces el otro bean gestionado se llama y otro Solicitud de frijol se inyecta. Yo, a continuación, modificar y ajustar el nuevo valor de mi Usuario, pero no tiene ningún efecto sobre mi petición inicial del objeto. Es allí una manera de pasar a la petición inicial del objeto a mi director de frijol, o para recuperarlo?
    • Primero esto: ¿qué es exactamente la razón por la que poner el usuario que ha iniciado sesión en un ámbito de petición bean? ¿Por qué usted necesita para mantener este bean vivo en las solicitudes posteriores? Me imaginaba que el login como en el ejemplo de código es en realidad un ámbito de sesión de frijol y de esta manera se puede asegurar que la User contiene datos actualizados en cada solicitud. Si este no es el caso, entonces User definitivamente debe ser un ámbito de sesión de frijol.
    • De hecho. Yo almacenar el nombre de usuario en un ámbito de sesión de frijol, y han conectado la user a la solicitud para asegurarse de que los datos se actualizan con regularidad. Mi problema aquí parece ser que en mi otro bean gestionado, el user puedo recuperar (por ejemplo, de la DB) y modificar no se propagan a la solicitud de ámbito bean (que ya ha sido construido cuando la solicitud fue despedido, antes la llamada a otro bean gestionado que hace un poco de lógica en ello)
    • Sólo tienes que guardar los cambios en la DB? Edit: si usted tiene 2 ámbito de petición frijoles de la misma clase en la misma clase, entonces definitivamente hay algo mal. No manualmente instancias de los frijoles en lugar de dejar que el JSF hacer el trabajo? De cualquier manera, usted necesita inyectar el ámbito de petición de frijol de la celebración de la User propiedad (como se muestra en tu pregunta) en el grano que está haciendo el trabajo de actualización.
    • El otro bean gestionado recupera el Usuario de la base de datos, a continuación, hace algunos cambios. Sin embargo, me he dado cuenta que me han dicho algunos confundir las cosas: la solicitud de ámbito bean no tenía ninguna referencia a mi otro bean, era lo opuesto a su alrededor. En una manera más lógica, la solicitud de ámbito bean debe hacer referencia a la otra, establecer el Usuario (que supongo que es el setter usted ha mencionado), a continuación, llamar a la otra bean gestionado método. Voy a cambiar las asociaciones de todo y mantenerlo actualizado. Edit: parece ths inyección de la propiedad de Usuario es exactamente el problema que yo no había entendido.
    • Usted podría estar en otro lugar haciendo un User user = new User() mientras que usted no debe hacer eso. Usted debe usar el que es administrado por el JSF. He actualizado la respuesta a inculude un ejemplo de cómo se debe trabajar. Edit: volver a la anterior comentario, cuando me dijo: «en la misma clase» quise hacer decir «en la misma petición».
    • El ejemplo de código ayudado a mi entender mi error (he mezclado las inyecciones, y la RequestScored se inyecta en el SessionScoped). Gracias por su ayuda de nuevo 🙂
    • Eres bienvenido. Está usted usando la primavera para administrar las inyecciones? JSF por sí mismo no permite la inserción de un ámbito de petición de frijol en un ámbito de sesión uno por @ManagedProperty. Habría lanzado una excepción durante la creación de la sesión en el ámbito de frijol con un mensaje como «ámbito de aplicación demasiado amplio» (porque no sabría ámbito de petición se debe inyectar, es decir, no puede haber más de una solicitud dentro de un período de sesiones).

Dejar respuesta

Please enter your comment!
Please enter your name here