Zakres „sesja” nie jest aktywny dla bieżącego wątku; IllegalStateException: Nie znaleziono żądania związanego z wątkiem
Mam kontroler, który chciałbym być unikalny na sesję. Zgodnie z dokumentacją wiosenną do wdrożenia są dwa szczegóły:
1. Początkowa konfiguracja sieci
Aby obsługiwać zakres fasoli na poziomie żądań, sesji i globalnych sesji (fasola o zasięgu WWW), przed zdefiniowaniem komponentów bean wymagana jest niewielka początkowa konfiguracja.
Dodałem następujące do mojegoweb.xml
jak pokazano w dokumentacji:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
2. Zakres fasoli jako zależności
Jeśli chcesz wstrzyknąć (na przykład) fasolę żądań HTTP do innego komponentu bean, musisz wstrzyknąć proxy AOP zamiast fasoli o zasięgu.
Napisałem fasolę za pomocą@Scope
zapewnienieproxyMode
jak pokazano niżej:
@Controller
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class ReportBuilder implements Serializable {
...
...
}
Problem
Pomimo powyższej konfiguracji otrzymuję następujący wyjątek:
org.springframework.beans.factory.BeanCreationException: Błąd podczas tworzenia komponentu bean o nazwie „scopedTarget.reportBuilder”: zakres „session” nie jest aktywny dla bieżącego wątku; rozważ zdefiniowanie zakresu proxy dla tego komponentu bean, jeśli zamierzasz odwoływać się do niego z singletonu; zagnieżdżonym wyjątkiem jest java.lang.IllegalStateException: nie znaleziono żądania związanego z wątkiem: czy odwołujesz się do atrybutów żądania spoza rzeczywistego żądania WWW, czy przetwarzasz żądanie poza pierwotnie odbieranym wątkiem? Jeśli faktycznie działasz w ramach żądania WWW i nadal otrzymujesz ten komunikat, Twój kod prawdopodobnie działa poza DispatcherServlet / DispatcherPortlet: W tym przypadku użyj RequestContextListener lub RequestContextFilter, aby ujawnić bieżące żądanie.
Aktualizacja 1
Poniżej znajduje się mój skan komponentów. Mam następująceweb.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>
I następne wAppConfig.java
:
@Configuration
@EnableAsync
@EnableCaching
@ComponentScan("org.example")
@ImportResource("classpath:applicationContext.xml")
public class AppConfig implements AsyncConfigurer {
...
...
}
Aktualizacja 2
Stworzyłem powtarzalny przypadek testowy. Jest to znacznie mniejszy projekt, więc istnieją różnice, ale ten sam błąd występuje. Istnieje kilka plików, więc przesłałem je jakotar.gz
domegafileupload.