Wstrzykiwanie beana sesyjnego do singletonu

0

Cześć!

Mam ogromy problem z którym już dłuższy czas poradzić sobie nie mogę.
Otóz posiadam beana:

 
@Component("messageListener")
public class MessageListener implements Serializable, ApplicationListener<MessageEvent>
{
...
	@Autowired
	@Qualifier("debtsController")
	private IDebtsControllerRefresher debtsController;
...

który posiada wyżej wymienioną zależność od beana debtController:

 
@Component("debtsController")
@Scope(value="session", proxyMode=ScopedProxyMode.INTERFACES)
public class DebtsController implements IDebtsControllerRefresher, IDebtsControllerJobStarter, IDebtsControllerDetailProvider
...

oczywiście wpis do kontekstu:
<context:component-scan base-package="com.gw.groupwallet.settlement" scoped-proxy="interfaces" />

oraz w web.xml

<listener>
	<listener-class>
  		org.springframework.web.context.request.RequestContextListener
	</listener-class>
</listener>
<filter>
	<filter-name>requestContextFilter</filter-name>
	<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>

i co ciekawe to wg dokumentacji springa i googla ma wystarczyć... a jednak ciągle otrzymuje:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.debtsController': Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:342)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:33)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:182)
	at $Proxy6.refreshNotFinalizedDebtsBeingCreditor(Unknown Source)
	at com.gw.groupwallet.event.MessageListener.onApplicationEvent(MessageListener.java:52)
	at com.gw.groupwallet.event.MessageListener.onApplicationEvent(MessageListener.java:20)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324)
	at com.gw.groupwallet.jobs.service.DebtsCheckerService.jobWasExecuted(DebtsCheckerService.java:64)
	at org.quartz.core.QuartzScheduler.notifyJobListenersWasExecuted(QuartzScheduler.java:1937)
	... 3 more
Caused by: java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
	at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131)
	at org.springframework.web.context.request.SessionScope.get(SessionScope.java:90)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:328)
	... 13 more
 

Błagam o jakiekolwiek wskazówki !!

0

A jak ty sobie to w ogóle wyobrażasz? o_O?
Przecież aktywnych sesji możesz mieć setki. Z jakim beanem ma być wtedy powiazany ten singleton bean? Rozumiem że chciałbyś żeby tak "magicznie" był powiązany zawsze w tym z aktywnej sesji? Ty chyba nie rozumiesz jak działa wstrzykiwanie zalezności. One są wstrzykiwane raz (!) przy instancjonowaniu beana!

0

zgadza sie, wpadlem na to samo po zapostowaniu.

Problem teraz jest następujący:

messageListener jest sesyjny i implementuje ApplicationListener.
wstrzykuje mu inne beany sesyjne.

Jako że implementuje applicationlistener to spring notyfikuje go wszystkimi eventami np ContextLoaded
Oczywiście podczas ładowania kontekstu sesji jeszcze nie ma więc leci error.
Jest na coś takiego jakieś lekarstwo ?

0

Nie wiem jak spring, ale np CDI i Guice sobie z tym radza. Tak, Shalom, zaleznosci wstrzykiwane sa raz, ale pytanie co jest tam wstrzykniete - w tym przypadki proxy, ktore, gdy trzeba, np wywola sie metode, wyszuka beana aktywnej sesji dla danego watku. Tak samo z beanami requestow.
Jak wy inaczej piszecie aplikacje?

0

aop:auto-proxy

0

@mućka @Szczery ale on tam wtrzykuje obiekt a nie aop:proxy. Zresztą Spring mu przeciez podpowiedział że mógłby użyć proxy w tym celu...
@studentSmutny możesz dodać w definicji tego beana

<aop:scoped-proxy />
0

CDI ani Guice nie potrzebuja zadnych specjalnych ustawien, same mi daja proxy jesli trzeba. Spring tego nie umie? I jeszcze wymaga ode mnie zebym to konfigurowal w oblesnym, nie typesafe pliku XML, odpornym na refaktoryzacje we wszystkim poza IDEA? Uh oh, ojej.

0

@mućka z tego: http://static.springsource.org/spring/docs/current/spring-framework-reference/htmlsingle/spring-framework-reference.html#beans-java-specifying-bean-scope
wynika że da się też za pomocą adnotacji jeśli ktoś potrzebuje, ale wiem że jeszcze jakiś czas temu sie nie dało ;]

0

@Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES)

1 użytkowników online, w tym zalogowanych: 0, gości: 1