Область 'сессия' не активна для текущего потока; IllegalStateException: не найден связанный с потоком запрос
У меня есть контроллер, который я хотел бы быть уникальным для каждой сессии. Согласно весенней документации есть две детали реализации:
1. Начальная веб-конфигурация
Чтобы поддерживать область действия bean-компонентов на уровне запросов, сеансов и глобальных сеансов (bean-объекты bean-scoped), перед определением ваших bean-компонентов требуется небольшая начальная конфигурация.
Я добавил следующее к моемуweb.xml
как показано в документации:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
2. Область применения бобов как зависимости
Если вы хотите внедрить (например) компонент области действия HTTP-запроса в другой компонент, вы должны внедрить прокси-сервер AOP вместо этого компонента.
Я аннотировал боб@Scope
предоставляяproxyMode
как показано ниже:
@Controller
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class ReportBuilder implements Serializable {
...
...
}
проблема
Несмотря на вышеуказанную конфигурацию, я получаю следующее исключение:
org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'scopedTarget.reportBuilder': область 'сеанс' не активна для текущего потока; рассмотрите возможность определения прокси-объекта с заданной областью действия для этого компонента, если вы собираетесь ссылаться на него из одноэлементного объекта; Вложенное исключение - java.lang.IllegalStateException: не найден привязанный к потоку запрос: Вы ссылаетесь на атрибуты запроса вне фактического веб-запроса или обрабатываете запрос вне первоначально получающего потока? Если вы действительно работаете в веб-запросе и по-прежнему получаете это сообщение, ваш код, вероятно, выполняется за пределами DispatcherServlet / DispatcherPortlet: в этом случае используйте RequestContextListener или RequestContextFilter, чтобы отобразить текущий запрос.
Обновление 1
Ниже мой компонент сканирования. У меня есть следующее вweb.xml
:
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>org.example.AppConfig</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
И следующее вAppConfig.java
:
@Configuration
@EnableAsync
@EnableCaching
@ComponentScan("org.example")
@ImportResource("classpath:applicationContext.xml")
public class AppConfig implements AsyncConfigurer {
...
...
}
Обновление 2
Я создал воспроизводимый контрольный пример. Это гораздо меньший проект, поэтому есть различия, но возникает та же ошибка. Там довольно много файлов, поэтому я загрузил его какtar.gz
вmegafileupload.