У меня есть контроллер, который хотел бы быть уникальным для каждого сеанса. Согласно документации spring для реализации есть две детали:
1. Начальная веб-конфигурация
Чтобы поддерживать область охвата beans на уровнях запросов, сеансов и глобальных сеансов (веб-область beans), перед определением вашего beans требуется некоторая младшая первоначальная конфигурация.
Я добавил следующее к моему web.xml
, как показано в документации:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
2. Области beans как зависимости
Если вы хотите ввести (например) HTTP-запрос с областью bean в другой bean, вы должны ввести прокси-сервер AOP вместо области bean.
Я аннотировал bean с @Scope
, предоставляя proxyMode
, как показано ниже:
@Controller
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class ReportBuilder implements Serializable {
...
...
}
Проблема
Несмотря на указанную выше конфигурацию, я получаю следующее исключение:
org.springframework.beans.factory.BeanCreationException: ошибка при создании bean с именем 'scopedTarget.reportBuilder': Scope 'session' неактивен для текущего потока; рассмотрите определение прокси-сервера с ограниченным доступом для этого bean, если вы собираетесь ссылаться на него из одноэлементного; Вложенное исключение - это 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.