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.

questionAnswers(8)

yourAnswerToTheQuestion