2011-02-18 6 views
5

Estoy desarrollando una aplicación web utilizando Struts 2 con un backend de Spring 3. Estoy usando Spring aop: beans proxy para manejar mis beans de sesión en lugar de la interfaz Struts 2 SessionAware. Todo funcionaba bien hasta que tengo una Acción que se ejecuta bajo el interceptor Struts ExecAndWait. Debido a que este interceptor en efecto ejecuta mi acción bajo un hilo separado, cuando intento acceder a mi bean de sesión procesada obtengo una BeanCreationException/IllegalStateException. ¿Hay alguna otra "forma de primavera" en la que pueda obtener mis beans de sesión en este escenario?Acceso a Spring Session con alcance Proxy Beans

Saludos

+0

Por supuesto, cuando el hilo hijo requiere acceso al bean, la sesión puede haber sido destruida por el usuario. Puede necesitar ser manejado revisando su alcance. –

Respuesta

0

puede implementar su propio interceptor ExecAndWait utilizando Spring. También puede delegar la gestión/creación de esta acción a Spring. Para más adelante, los detalles están en la documentación del plugin S2 Spring.

3

De Execute and Wait Interceptor documentación

Importante: Debido a que la acción va a correr en un hilo independiente, no se puede utilizar ActionContext porque es un ThreadLocal. Esto significa que si necesita acceder, por ejemplo, a datos de sesión, debe implementar SessionAware en lugar de llamar a ActionContext.getSession().

El problema de la sesión en grano con ámbito es que dependen de los atributos de subproceso local establecidos por RequestContextListener o RequestContextFilter. Pero el último le permite establecer un indicador threadContextInheritable muy interesante ...

Si su interceptor ExecAndWait crea un nuevo hilo por cada solicitud que sirve, el hilo heredable local debe propagar los beans con ámbito de sesión a subprocesos hijo. Sin embargo, si Struts usa el grupo de subprocesos (más probablemente, no he utilizado Struts2 por edades) para atender estas solicitudes, esto tendrá resultados inesperados y peligrosos. Puede experimentar con esta bandera, tal vez haga el truco.

0

Puede usar, RequestContextHolder (clase Holder para exponer la solicitud web en forma de un objeto RequestAttributes enlazado a hilos) para hacer que los beans proxy de sesión estén disponibles para hilos hijo.

Definir una costumbre ExecuteAndWait Interceptor y en el método doIntercept utilizar el siguiente método estático de RequestContextHolder

setRequestAttributes public static void (atributos RequestAttributes, booleano heredable)

obligar a la RequestAttributes dado a la actual hilo.

Parámetros: atributos - los RequestAttributes para exponer, o null para restablecer el contexto hilo unido heredable - ya sea para exponer la RequestAttributes como heredable para roscas niño (utilizando un InheritableThreadLocal)

Muestra Código

public class CustomExecuteAndWaitInterceptor extends ExecuteAndWaitInterceptor { 

    @Override 
    protected String doIntercept(ActionInvocation actionInvocation) throws Exception { 
     RequestAttributes requestAtteiAttributes = RequestContextHolder.getRequestAttributes(); //Return the RequestAttributes currently bound to the thread. 
     RequestContextHolder.setRequestAttributes(requestAtteiAttributes, true); 
     //do something else if you want .. 
     return super.doIntercept(actionInvocation); 

    } 
} 
Cuestiones relacionadas