Доступ к прокси-компонентам в рамках Spring Session - PullRequest
5 голосов
/ 18 февраля 2011

Я занимаюсь разработкой веб-приложения с использованием Struts 2 с бэкэндом Spring 3.Я использую Spring aop: прокси-компоненты для обработки моих сессионных компонентов, а не интерфейс Struts 2 SessionAware.Все работало нормально, пока у меня не появилось действие, выполняемое под перехватчиком Struts ExecAndWait.Поскольку этот перехватчик фактически выполняет мое действие в отдельном потоке, когда я пытаюсь получить доступ к своему прокси-компоненту сеанса, я получаю исключение BeanCreationException / IllegalStateException.Есть ли другой «весенний путь», которым я могу овладеть сессионными компонентами в этом сценарии?

С уважением

Ответы [ 3 ]

3 голосов
/ 20 февраля 2011

С Перехватчик выполнения и ожидания Документация

Важное : поскольку действие будет выполняться в отдельном потоке, выне может использовать ActionContext, потому что это ThreadLocal.Это означает, что если вам нужен доступ, например, к данным сеанса, вам нужно реализовать SessionAware, а не вызывать ActionContext.getSession ().

Проблема с bean-компонентами сеанса в том, что они зависят от потокалокальные атрибуты, установленные RequestContextListener или RequestContextFilter .Но последнее позволяет вам установить очень интересный флаг threadContextInheritable ...

Если ваш перехватчик ExecAndWait создает новый поток при каждом запросе, который он обслуживает, унаследованный локальный поток должен распространять бины сессионной области на дочерние потоки.Однако если Struts использует пул потоков (скорее всего, вы не использовали Struts2 целую вечность) для обслуживания этих запросов, это приведет к очень неожиданным и опасным результатам.Вы можете поэкспериментировать с этим флагом, возможно, он сработает.

0 голосов
/ 02 февраля 2014

Вы можете использовать, RequestContextHolder (класс Holder для предоставления веб-запроса в форме объекта RequestAttributes с привязкой к потоку.), Чтобы сделать прокси-бины области сеанса доступными для дочерних потоков.

Определите пользовательский перехватчик ExecuteAndWait и в методе doIntercept используйте следующий статический метод из RequestContextHolder

public static void setRequestAttributes (атрибуты RequestAttributes, логическое наследуемое )

Свяжите данные атрибуты RequestAttributes с текущим потоком.

Параметры: атрибуты - RequestAttributes, чтобы выставить, или нуль, чтобы сбросить связанный с потоком контекст наследуемый - предоставлять ли атрибуты RequestAttributes как наследуемые для дочерних потоков (с использованием InheritableThreadLocal)

Пример кода

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

    }   
}
0 голосов
/ 20 февраля 2011

Вы можете реализовать свой собственный перехватчик ExecAndWait, используя Spring. Вы также можете делегировать управление / создание этого действия в Spring. Более поздние подробности находятся в документации плагина пружины S2.

...